夕口技術錄

專業上的小常識,備而用之~

PHP 中的正則表達式

1. PHP 中的正則表達式
2. 八個實用的PHP正則表達式
3. 如何書寫更易閱讀的PHP正則表達式
4. 半小時精通正則表達式
5. 正則在文章採集系統中的應用及常見問題答疑
6. …更多策劃中

文章內容來源方面,有本站舊文重新整理而來,也有翻譯英文文獻而來(感謝在加拿大的!oEL同學),還有些是個人心得.
個人能力有限,肯定有一些錯誤,發現的朋友請給予提醒以及時更正. 不至誤導新手. 如果文章能給大家一些參考,就很滿足了. 也歡迎PHP愛好者投稿,完善本系列,讓新手少走一些彎路.


PHP與正則表達系列之: PHP 中的正則表達式

正則表達式簡介及正則表達式在PHP中的作用

正 則表達式是一種表示規則的途經,在 PHP 中利用這些規則可以讓你靈活變通地匹配檢驗替換以及修改 字符串。本文涉及到 PCRE 的基礎,以及如何使用 preg_match(),preg_replace(),and preg_split() 函數。

接下來就讓我們從實例循序漸進地開始學習如何使用這些函數。

規則匹配 preg_match

利用 preg_match(),我們可以完成字符串的規則匹配。如果找到一個匹配,preg_match() 函數返回 1,否則返回 0。還有一個可選的第三參數可以讓你把匹配的部分存在一個數組中。在驗證數據時這個功能可以變得非常有用。

$string = “football";
if (preg_match(‘/foo/’, $string)) {
// 匹配正確
}

上面的例子將成功匹配,因為單詞 football 裡面包含 foo。現在我們來試一個更複雜的,例如驗證一個 Email 地址。

$string = “first.last@domain.uno.dos";
if (preg_match(
‘/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/’,
$string)) {
// 驗證Email地址
}

這個例子將驗證出此 Email 地址為正確格式。現在讓我們來看看這段正則表達式所代表的各種規則。

PCRE 顧名思義,與在 Perl 中的正則表達式有相同的語法,所以每段正則表達式必須要有一對定界符。我們一般使用 / 為定界符。

開頭的 ^ 和結尾的 $ 讓PHP從字符串開頭檢查到結尾。假使沒有 $,程序仍會匹配到 Email 的末尾。

[] 被用來限制許可輸入類型。例如 a-z 允許所有的小寫字母,A-Z 允許所有的大寫字母,0-9 所有數字,等等,以及更多其他類型。

{} 被用來限制期望的字符數。例如 {2,4} 表示字符串的每一節可以有 2-4 字符長度,像是 .com.cn 或 .info。在這裡, “." 並不算一個字符,因為 {2,4} 之前定義的許可輸入類型只有大小寫字母,故此段只匹配大小寫字母

() 被用來合併小節,並定義字符串中必須存在的字符。(a|b|c) 能夠匹配 a 或 b 或 c。

(.) 將匹配所有字符,而 [.] 只匹配 “." 本身。

要使用一些符號本身,必須在前增加一個 。這些字符有:( ) [ ] . * ? + ^ | $

規則替換 preg_replace

preg_replace 允許你替換字符串中匹配到你定義的正則表達式。一個簡單的註釋移除功能:

preg_replace(‘[(/*)+.+(*/)]’, “, $val);

這段代碼可以移除在 PHP 和 CSS 中使用 /* 註釋 */ 格式的多多行註釋。其中的三個參數分別為正則表達式,要替換成的字符串和要替換的目標字符串(這裡要做移除功能,所以是個空白字符串 -> “)。如果你想匹配次級規則,可以使用 $0 代表全部匹配,$1、$2 等,以此類推代表分別的次級規則。

規則分割preg_split

preg_split 可以將整段字符串按匹配到的正則表達式分割成 1、2或更多字符的多段。比如獲取標籤,無論是用空格還是逗號分隔的:

$tags = preg_split(‘/[,]/’, ‘my,tags,unevenly,spaced’);
print_r($tags);

正則表達式是一個很實用的技巧,讓你可以專注於所期望得到的內容。

但有時候一段正則表達式並不能讓你如願以償得到預期的結果是件很煩人的事,所以我將在本系列的第二篇文章附上一些簡單的語法指南希望能夠幫到大家。

如果你想跳過痛苦的練習過程而直接獲得一些成功的喜悅感,請期待PHP5研究室推出的 “PHP與正則表達系列之二: 八個實用PHP正則表達式"。

附:PCRE 語法指南

/ 定界符
^ 字符串頭
$ 字符串尾
[a-z] 所有小寫字母
[A-Z] 所有大寫字母
[0-9] 所有數字
? 零或一個緊接前的字符
* 零或多個緊接前的字符
+ 一或多個緊接前的字符
{4} 4個緊接前的字符
{4,8} 4-8個緊接前的字符
. 任意字符
(red|green|blue) Red 或 green 或 blue(紅 或 綠 或 藍)
s 空格

特殊字符(需要在前加 )

( ) [ ] . * ? + ^ | $

PHP5研究室 2008年01月14日00:41 作者:esayr, LEO

2 responses to “PHP 中的正則表達式

  1. Dio 2010/12/11 於 10:13:33

    最近被正則表達式搞的灰頭土臉的 = ="

發表留言