2014年6月27日 星期五

PHP: 中文正規表示式(RE, Regular Expression)


在php裏,中文的正規表示式通常是用  mb_ereg() 及 mb_ereg_replace() 來完成,我也有在網路上找到用 perg_match() 和 preg_replace() 來完成中文的操作,但是那個有如天書一般的過程,實在很難讓人理解。

在使用正規表示式之前,必需先設定使用的字元編碼,以utf-8為例,必須先執行以下2個函數,字串的操作才會正常

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

函式說明:

int mb_ereg ( string $pattern , string $string [, array $regs ] )

Executes the regular expression match with multibyte support.
用來找到字串中的特定pattern

string mb_ereg_replace ( string $pattern , string $replacement , string $string [, string$option = "msr" ] )

Replace regular expression with multibyte support.
Scans string for matches to pattern, then replaces the matched text with replacement
用來對字串的內容做修改



使用範例:

1、要將字所包含的資料依分副符號分離開來

例:國土建字第1020000142號-0424-1020508A+0509C+0523A+0517B+0517C+0614B-紙本公文-1488

這個檔名字串主要是用 - 當做分隔符號來分隔不同的資訊
mb_ereg('([\w\.]+)-([0-9]+)-(.*)', $filename, $aryData);
$code = $aryData[1]; // 文號
$d = $aryData[2];  // 發文日期
$info = $aryData[3];  // 其他資訊

2、從中文字串中取得數字的部份

例:文號為「國土建字第1020000142號」,要從文號中取得發文的年度,也就是數字的前3碼

mb_ereg('([0-9.]+)', $code, $aryData);
if($debug) echo "sn: ".$aryData[0]."\n"; // 0表示符合pattern 的所有字串
$cht_year = substr($aryData[0], 0, 3);
if($debug) echo "民國 ".$cht_year." 年\n";
$year = 1911 + intval($cht_year);
if($debug) echo "西元 ".$year." 年\n";

3、去除字串中的所有空白

mb_ereg_replace("/\s/", "", $string);

WildCard
\w : 字元
\s : 空白


注意事項:

1、ereg開頭的函數在PHP5.3之前會 Deprecated ,建議用 preg 取代;mb_ereg 開頭的函式不受影響。


參考資料:

1、鳥哥的 Linux 私房菜 第十二章、正規表示法與文件格式化處理http://linux.vbird.org/linux_basic/0330regularex.php

2、http://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/

沒有留言: