星期四, 8月 03, 2006

PHP 的字串處理

喜歡 PHP 的另一個原因,是因為它提供許多方便的字串處理函式。

文件上說,PHP 這個程式語言,是採擷 Perl、C、以及 Java 的一些優點所形成。Perl 的優點是什麼呢?我覺得,主要就是提供一套強大的處理函式,可以利用正規語言表達式 (Regular Expression,或可直接譯為「正規表達式」) 來對字串進行比對與取代。

雜事做多了,就自然能夠感受 Perl 或 PHP 那些處理字串函式的優點。例如,很常見的一項雜務,就是一個「a,b,c,d,e」這樣的字串,用逗點切分,放在陣列中供後續處理;或者反過來,將一個陣列的內容一個個地傾印出來,但是在兩項內容間,加入一個分號。PHP 的 explode() 與 implode(),就可以做這樣的事情:

$s = "a,b,c,d,e";
$array = explode(",", $s);
$t = implode(";", $array);

就像是 Perl,PHP 也提供了更強大方便的 regular expression 的字串處理函式(事實上,PHP 支援了 Perl-Compatible 與 POSIX-Extended 兩種正規表達式的處理標準)。例如,由於 HTML tag 的屬性值,可以用雙引號、單引號、或甚至「沒有引號」來標示,我們可能會想將一篇文件的 href 統一用雙引號來框住。也就是說,會想將

<a href='www.yahoo.com'>Yahoo</a>
<a HREF=www.google.com>Google</a>

這樣的字串們取代為

<a href="www.yahoo.com">Yahoo</a>
<a href="www.google.com">Google</a>

在 PHP 裡,要達到這樣的功能是頗容易的:

$pattern = "/<a href=(['\"]?)(.+?)\\1>/i";
$replaced_by = "<a href=\"$2\">";
$t = preg_replace($pattern, $replaced_by, $s);

只要大家嘗試用一般的字串處理函式來實作,吃過苦頭(因為麻煩又無趣)後,應該就會同意,正規表達式在字串處理上的的威力與優點。

雖然,現今廣用的程式語言幾乎都有提供 regex.Matcher 與 regex.Pattern 之類的物件,可以依循正規表達式處理字串;但我覺得,繼承了 Perl 的優點後,PHP 在正規表達式的使用上,還是比那些物件導向語言,來得自然、方便太多了。

1 則留言:

匿名 提到...

寫個無關主題的:
學長的blog用Firefox看是正常的, 用IE的話好像左邊選單就不見了 .....