整理一些 Regex 的學習資源

我第一次接觸 Regular Expression (正規表示式) 是 8 年前在學 Perl 程式語言的時候,當初一開始接觸 Regular Expression 時好像看到無字天書一樣,實在是無法「直接看語法」猜到 Regular Expression 的意義,所以只好一個規則一個規則的看,看不懂先跳過,然後一行程式一行程式的練習寫、寫錯就一直改,直到熟能生巧後,日後的子不知道省去我多少時間啊!任何有需要「字串處理」的地方全部都用 Regular Expression 來寫,不管是 Perl, PHP, JavaScript, C# 全部都有支援 Regular Expression,且語法規則都大同小異,所以真的是學一次用一輩子,反正是程式設計師一定要學的技能就是了。

學習資源

開發工具 / 學習工具

 

  

此文章由 will 發表於 2008/3/23 下午 11:20:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | C# | JavaScript | PHP

標籤:

收藏:

介紹一個 PHP 套件:ODBTP

ODBTP ( Open Database Transport Protocol ) 是一個可以從任意作業平台連線到 Windows ODBC 資料來源的工具函數庫,他透過 TCP/IP 連接到 Windows 主機的一個系統服務 ( ODBTP service ),直接透過這個 ODBTP service 與系統本身的 ODBC 介面直接與資料庫溝通,等於跳過了 PHP 的資料庫連接層,也省去了在 PHP 上開發各式資料庫的 extension,十分的輕鬆省事。

ODBTP 除了可以連接 MS SQL Server 之外,任何支援 ODBC 的資料庫(幾乎是全部)都可以用 ODBTP 來連接,所以連 Access DB 也可以喔,沒想到如何在 Linux 下開啟 Windows 的 Access 檔吧!當你的 Linux 主機上的 PHP 要存取 Windows 上的資料庫時,使用 ODBTP 算是蠻不錯的選擇,也比較不會出問題,我之前就是開發 PHP + MS SQL Server 時發生了一些奇怪的錯誤,使用 ODBTP 就解決了 (因為真正跟資料庫連線的方式是 ODBC,PHP 雖然也有 ODBC driver 但還是有些 Bugs)。

如果你有在使用 ADOdb Library for PHP 套件的話,它也有支援 ODBTP 的 Driver,這個套件也是我十分推薦的資料庫抽象層套件。

相關連結:

 

  

此文章由 will 發表於 2008/2/19 上午 12:07:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: PHP

標籤: , ,

收藏:

Phalanger - The PHP Language Compiler for the .NET Framework

什麼? PHP for .NET Framework? 酷!現在連 PHP 都可以在完全不用修改的情況下 compile 成 .NET 組件,最新的 Phalanger v2.0 甚至可以將 MediaWiki 完全不用修改原始碼的情況下直接轉到 .NET 上面跑!還可以用 PHP 寫 Silverlight 耶!也可以用 PHP 直接使用 ASP.NET 2.0 Framework 的所有資源!

我慢慢的看出微軟在 .NET 所下的苦工了,這種慢慢的蠶食鯨吞軟體開發者的心,雖然是條漫長的路,不過也越來越有趣了。

Phalanger - The PHP Language Compiler for the .NET Framework

http://www.codeplex.com/Phalanger

Phalanger project

http://php-compiler.net/doku.php

  

此文章由 will 發表於 2007/12/20 上午 08:30:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | PHP | .Net

標籤:

收藏:

MySQL 4.1/5 如何將現有 latin1 中文資料匯入成 UTF-8 資料

字集字碼的問題真的是很麻煩的,沒有好的觀念實在很難解決這麼多字集字碼的問題,尤其在轉換資料的時候,最是痛苦,很多人解決不了也是妥協,但常看到別人的網站上出現一堆 \ ? 等字元,站長本身又無法解決時,想必也是很難過吧。以下這篇文章是非常精華的一篇關於如何將 MySQL 4.0 完整且正確的升級至 MySQL 4.1/5.0 的說明。 至於文章中的名人「許功蓋」相信大家都知道是誰吧!^_^

MySQL 關於 Character Sets and Collations 的詳細定義在此:

    http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

概要說明一下:

mysql> set names utf8; set character set utf8;
mysql> SELECT name FROM `cms_content` WHERE `name` LIKE CONVERT( _big5 '%許功蓋%' USING utf8 );

CONVERT:

    宣告 '%歐白%'  為 BIG5 字集,並轉成 UTF8 字碼,用於 SQL 查詢

真相:

    只要用 casting 功能就可以下出正確的 SQL Command

    e.g. 

        mysql> set names utf8;set character set utf8;
        mysql> SELECT name FROM `cms_content` WHERE `name` LIKE _big5 '%許功蓋%';

        mysql> set names big5;set character set big5;
        mysql> SELECT name FROM `cms_content` WHERE `name` LIKE _big5 '%許功蓋%';

        只要能指定「字串」的字集,MySQL 就能辨認字串的比對!  用  _big5 'XXXXX'
        這兩段的結果都可以正確查到資料!

情況(一):轉移 MySQL 4.0 之前的資料

    1. 先 CREATE DATABASE 指定字集為 big5

        CREATE DATABASE `dbname1` DEFAULT CHARACTER SET UTF8;

    2. 選擇資料庫

        USE `dbname1`;

    3. 再宣告接下來要輸入 SQL 所使用的字集 ( Big5 )

        SET NAMES 'big5';
        SET CHARACTER SET big5;

    4. 再來,就新增資料

        CREATE TABLE or INSERT INTO

情況(二):轉移網站 PHP 程式

    在資料庫連線後,立即執行兩行 SQL 指令:

    $conn->Execute("SET NAMES 'big5'");   
    $conn->Execute("SET CHARACTER SET big5");

情況(三):開發新的 PHP 網站

    1. 資料庫、表格與欄位皆宣告為 UTF8

    2. 訊息在處理的時候,程式要先宣告使用的字集: ( e.g. Big5 或 UTF-8 )

        $conn->Execute("SET NAMES 'big5'");   
        $conn->Execute("SET CHARACTER SET big5");

    3. 最好在輸入資料庫的時候,完全以 utf8 存入資料庫

        ※ 潛在問題:

        1. 若輸入字集為 Big5,但 Browser 會將「非Big5」的字集變成 Unicode Entities,要如何正確存入 MySQL 5

            - 策略:先將 BIG5 文字轉成 UTF-8,再將 Unicode Entities 轉成 UTF-8,就大功告成啦!我真是天才~  ^____^
            - 解答:

      $tmp = '我是Will!  :: ク チ コ ミ 付 き 全 国 う ま い ラ';
      $str = iconv("BIG5", "UTF-8", $tmp);
      $str = unescape($str);     # unescape 定義在下方

      $conn->Execute("SET NAMES 'UTF8'");
      $conn->Execute("SET CHARACTER SET UTF8");

      $conn->Execute("INSERT INTO test VALUES ('[ ".date("Y-m-d H:i:s")." ] ".$str."');");

        2. 若輸出的字集是 Big5,原本的 UTF-8 用 iconv 可能無法完全轉回 Big5,要如何將無法轉換的部分轉成 Entities 呢?

            - 策略:先取出所有 UTF-8 的單字,一個一個用 iconv 轉換,轉換不成功的再轉成 Entities
            - 解答:

        $s = ddc_readfile("/home/demo/utf8.txt");

        function utf8_to_big5($str)
        {
            #$to_charset = 'BIG5';
            #$to_charset = 'GB2312';
            #$to_charset = 'UTF-8';

            $old_mb_internal_encoding = mb_internal_encoding();

            mb_internal_encoding('UTF-8');

            $len = mb_strlen($str);

            $buf = '';

            for($i=$len ; $i > 0 ; $i--)
            {
                $idx = $len - $i;

                $char = mb_substr($str, $idx, 1);

                $char_b5 = iconv("UTF-8", $to_charset, $char);

                if($char_b5 == '') {
                    $char = utf8ToUnicodeEntities($char);
                }
                else {
                    $char = $char_b5;
                }

                $buf .= $char;
            }

            mb_internal_encoding($old_mb_internal_encoding);

            return $buf;
        }

        # header("Content-Type: text/html; charset=UTF-8");
        $n = utf8_to_big5($s);

        echo($n);

        ※ 若應用程式是以 Big5 做為傳遞的依據,可以用以下方式確保輸入的字集都是 utf8

        # 先判斷該字串是否為 UTF-8 字串,若不是則用 iconv 從 BIG5 轉換至 UTF-8
        if (iconv('UTF-8', 'UTF-8', $xml) != $xml) {
            $xml = iconv("BIG5", "UTF-8", $xml);
        }

        # 再將所有 Browser 自動轉換的 Entities 轉成 Unicode 字串
        $xml = preg_replace_callback("/(&#[0-9]{1,5}+;)/", "preg_utf8Encode", $xml);
           
        function preg_utf8Encode($matches)
        {
           #dp($matches[1]);
           return utf8Encode($matches[1]);
        }

        function utf8Encode ($source)
        {
            $utf8Str = '';
            $entityArray = explode ("&#", $source);
            $size = count ($entityArray);
            for ($i = 0; $i < $size; $i++)
            {
                $subStr = $entityArray[$i];
                $nonEntity = strstr ($subStr, ';');
                if ($nonEntity !== false)
                {
                  /* Add by Will Huang - BEGIN */
                  if(substr ($subStr, 0, 1) == 'x') {
                    $unicode = intval(hexdec(substr ($subStr, 1, (strpos ($subStr, ';')+1))));
                  }
                  else
                  /* Add by Will Huang - END */
                    $unicode = intval (substr ($subStr, 0, (strpos ($subStr, ';') + 1)));

                    // determine how many chars are needed to reprsent this unicode char
                    if ($unicode < 128) {
                    $utf8Substring = chr ($unicode);
                    }
                    else if ($unicode >= 128 && $unicode < 2048) {
                        $binVal = str_pad (decbin ($unicode), 11, "0", STR_PAD_LEFT);
                        $binPart1 = substr ($binVal, 0, 5);
                        $binPart2 = substr ($binVal, 5);

                        $char1 = chr (192 + bindec ($binPart1));
                        $char2 = chr (128 + bindec ($binPart2));
                        $utf8Substring = $char1 . $char2;
                    }
                    else if ($unicode >= 2048 && $unicode < 65536) {
                        $binVal = str_pad (decbin ($unicode), 16, "0", STR_PAD_LEFT);
                        $binPart1 = substr ($binVal, 0, 4);
                        $binPart2 = substr ($binVal, 4, 6);
                        $binPart3 = substr ($binVal, 10);

                        $char1 = chr (224 + bindec ($binPart1));
                        $char2 = chr (128 + bindec ($binPart2));
                        $char3 = chr (128 + bindec ($binPart3));
                        $utf8Substring = $char1 . $char2 . $char3;
                    }
                    else {
                        $binVal = str_pad (decbin ($unicode), 21, "0", STR_PAD_LEFT);
                        $binPart1 = substr ($binVal, 0, 3);
                        $binPart2 = substr ($binVal, 3, 6);
                        $binPart3 = substr ($binVal, 9, 6);
                        $binPart4 = substr ($binVal, 15);

                        $char1 = chr (240 + bindec ($binPart1));
                        $char2 = chr (128 + bindec ($binPart2));
                        $char3 = chr (128 + bindec ($binPart3));
                        $char4 = chr (128 + bindec ($binPart4));
                        $utf8Substring = $char1 . $char2 . $char3 . $char4;
                    }

                    if (strlen ($nonEntity) > 1) {
                        $nonEntity = substr ($nonEntity, 1); // chop the first char (';')
                    }
                    else  {
                        $nonEntity = '';
                    }

                    $utf8Str .= $utf8Substring . $nonEntity;
                }
                else {
                    $utf8Str .= $subStr;
                }
            }

            return $utf8Str;
        }

UTF-8 Notes:

http://php.nctu.edu.tw/manual/en/function.iconv.php

<?php
//script from http://zizi.kxup.com/
//javascript unesape
function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
  $ar = $r[0];
print_r($ar);
  foreach($ar as $k=>$v) {
   if(substr($v,0,2) == "%u")
     $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
   elseif(substr($v,0,3) == "&#x")
     $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
   elseif(substr($v,0,2) == "&#") {
echo substr($v,2,-1)."<br>";
     $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
   }
  }
  return join("",$ar);
}
?>

 


**********************************************
使用 ADOdb for PHP4 如何順利將 PHP4 + MySQL 4.0 升級至 PHP4 + MySQL 4.1/5.0

※ 必要條件:要安裝 iconv、一定要是輸入 BIG5 的字

※ 開啟 adobe/adodb.inc.php 檔案,並修改以下兩個 Function !!!

    function b2u_walk (&$item, $key) {
        if(!is_array($item)) {
            $item = iconv("BIG5", "UTF-8//IGNORE", $item);
        }
    }

    function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false)
    {
        array_walk($arrFields, 'b2u_walk');
       
        global $ADODB_INCLUDED_LIB;
        if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
       
        $tmp = _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq);
        $tmp = iconv("UTF-8", "BIG5//IGNORE", $tmp);
        return $tmp;
    }

    function GetInsertSQL(&$rs, $arrFields,$magicq=false)
    {
        array_walk($arrFields, 'b2u_walk');
       
        global $ADODB_INCLUDED_LIB;
        if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
       
        $tmp = _adodb_getinsertsql($this,$rs,$arrFields,$magicq);
        $tmp = iconv("UTF-8", "BIG5//IGNORE", $tmp);
        return $tmp;
    }

  

此文章由 will 發表於 2007/12/18 下午 12:26:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: MySQL | PHP

標籤: , ,

收藏:

取得 Google Page Rank 的方法 ( PHP Example )

這段程式碼是用 PHP 寫的,轉成 .NET 應該不難吧,如果有人轉成功記得告訴我一下。 ^^

<?php echo getrank($url,$dc); ?>

<?php
// PHP Google PageRank Calculator Script
// -------------------------- April 2005
// Contact author: pagerankscript@googlecommunity.com

// for updates, visit:
// http://www.googlecommunity.com/scripts/google-pagerank.php

// provided by www.GoogleCommunity.com
//  an unofficial community of Google fans
// ---------------------------------------

// Instructions
//  Upload pagerank.php to your server
//  Call it like this: http://www.example.com/pagerank.php?url=http://www.yahoo.com/
//   example.com is your website. yahoo.com is the website to get the PR of
//  The code below displays the PR for $url

/*
    This code is released unto the public domain
*/
//header("Content-Type: text/plain; charset=utf-8");
define('GOOGLE_MAGIC', 0xE6359A60);

//unsigned shift right
function zeroFill($a, $b)
{
    $z = hexdec(80000000);
        if ($z & $a)
        {
            $a = ($a>>1);
            $a &= (~$z);
            $a |= 0x40000000;
            $a = ($a>>($b-1));
        }
        else
        {
            $a = ($a>>$b);
        }
        return $a;
}

function mix($a,$b,$c) {
  $a -= $b; $a -= $c; $a ^= (zeroFill($c,13));
  $b -= $c; $b -= $a; $b ^= ($a<<8);
  $c -= $a; $c -= $b; $c ^= (zeroFill($b,13));
  $a -= $b; $a -= $c; $a ^= (zeroFill($c,12));
  $b -= $c; $b -= $a; $b ^= ($a<<16);
  $c -= $a; $c -= $b; $c ^= (zeroFill($b,5));
  $a -= $b; $a -= $c; $a ^= (zeroFill($c,3));
  $b -= $c; $b -= $a; $b ^= ($a<<10);
  $c -= $a; $c -= $b; $c ^= (zeroFill($b,15));

  return array($a,$b,$c);
}

function GoogleCH($url, $length=null, $init=GOOGLE_MAGIC) {
    if(is_null($length)) {
        $length = sizeof($url);
    }
    $a = $b = 0x9E3779B9;
    $c = $init;
    $k = 0;
    $len = $length;
    while($len >= 12) {
        $a += ($url[$k+0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24));
        $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24));
        $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24));
        $mix = mix($a,$b,$c);
        $a = $mix[0]; $b = $mix[1]; $c = $mix[2];
        $k += 12;
        $len -= 12;
    }

    $c += $length;
    switch($len)              /* all the case statements fall through */
    {
        case 11: $c+=($url[$k+10]<<24);
        case 10: $c+=($url[$k+9]<<16);
        case 9 : $c+=($url[$k+8]<<8);
          /* the first byte of c is reserved for the length */
        case 8 : $b+=($url[$k+7]<<24);
        case 7 : $b+=($url[$k+6]<<16);
        case 6 : $b+=($url[$k+5]<<8);
        case 5 : $b+=($url[$k+4]);
        case 4 : $a+=($url[$k+3]<<24);
        case 3 : $a+=($url[$k+2]<<16);
        case 2 : $a+=($url[$k+1]<<8);
        case 1 : $a+=($url[$k+0]);
         /* case 0: nothing left to add */
    }
    $mix = mix($a,$b,$c);
    /*-------------------------------------------- report the result */
    return $mix[2];
}

//converts a string into an array of integers containing the numeric value of the char
function strord($string) {
    for($i=0;$i<strlen($string);$i++) {
        $result[$i] = ord($string{$i});
    }
    return $result;
}

function getrank($url) {
    $url = 'info:'.$url;
    $ch = GoogleCH(strord($url));
    $file = "http://www.google.com/search?client=navclient-auto&ch=6$ch&features=Rank&q=$url";
    $data = file($file);
    $rankarray = explode (':', $data[2]);
    $rank = $rankarray[2];
    return $rank;
}

?>

  

此文章由 will 發表於 2007/12/7 上午 01:02:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: PHP

標籤: ,

收藏: