進階級-正則表達式

簡述

正則表達式(regular expression):描述可能出現在用戶提交的文本中的一小段代碼,我們通過它,將出現的代碼塊替換爲特殊格式。
正則表達式廣泛好用,但入門困難。

語法規範

分隔符

目標代碼塊被分隔符包圍,分隔符一般選用斜槓(/)或井號(#),也可以用除字母、數字和反斜槓之外的任何字符作爲分隔符。反斜槓可以轉義,轉義在基礎級文章略有提及,此處不贅述。

模式修飾符

默認情況下,正則表達式區分大小寫,不過我們可以通過模式修飾符(pattern modified),使正則忽略大小寫。
模式修飾符是一個單個的字符標誌,跟在表達式的結束分隔符後。

符號 註釋
i 匹配時,不區分大小寫

特殊字符

符號- 中文名—- 註釋
^ 脫字字符 匹配字符串的開始,自身不包含任何字符,只考慮字符位置
$ 美元符號 匹配字符串的結尾,同上
. 點號 通配符,匹配任何單個字符,除了換行(\n)
* 星號 要求前面的字符出現0或多次,具有貪婪屬性1
+ 加號 要求前面的字符出現1或多次,具有貪婪屬性
? 問號 匹配前面的子表達式0次或1次,在*+的後面加上一個?就可以實現非貪婪(最小匹配,minimal match)
| 管道符號 正則匹配管道左或右邊的模式
(…) 圓括號 標記一個子表達式的開始和結束位置。可對其應用一個修飾符,至於結束括號後即可
[…] 方括號 定義字符類(character class),匹配方括號列出的字符之一。在前方括號後加入^,即可匹配 除去方括號包含的字符

轉義序列

(escape sequences)
意義:匹配不太容易輸入的一個字符,或匹配某種類型的一個字符。

符號 註釋
\n 換行字符
\r 回車字符
\t 製表符
\s 空白字符(whitespace character),等同[\n\r\t]
\S 非空白字符,等同[^\n\r\t]
\d 數字,等同[0-9]
\D 非數字,等同[^0-9]
\w 單詞字符,等同[a-zA-Z0-9_]
\W 非單詞字符,等同[^a-zA-Z0-9_]
\b 表示單詞邊界(起始/結束)
\B 表示非單詞邊界(非起始/結束)

PHP中的正則函數

preg_match:

用來確認一個特定的字符串,是否匹配一個正則表達式。

preg_replace:

接受一個正則表達式和一個文本字符串,並嘗試在字符串中匹配該正則表達式。還接受另一個文本字符串,並用該字符串來替換每一次正則匹配。
preg_replace (regExp, replaceWith, OldString [, $limit = -1(無窮) [, int &$count ]] )
例子:

$test = preg_replace('/_([^_]+)_/', '<em>$1</em>');
// 每一個圓括號內,都包含了一個塊內容,而塊內容的名稱按$1、$2……依次遞增,在JScript 中則使用 $0…$9 屬性。

str_replace:

搜索字符串而非正則表達式模式,類似preg_replace函數,但比之更爲高效,對於不區別大小寫的簡單替換,可以用它來代替。

結語

正則表達式並沒有那麼容易,但無論如何,既然從事這個職業,既然愛上了編程和編程所涉及的部分方面,我們就應該去盡力做好,將正則寫的優雅而易讀,這並不能從技術上降低正規表達式的複雜性,但可以使它們更容易被理解
By the way,匹配中文字符的正則表達式: [\u4e00-\u9fa5]。

參考資料:1
《PHP&MySQL Novice to Ninja》(Kevin Yank [澳])
正則表達式 - 菜鳥教程
preg-replace - 官方手冊


  1. 匹配時,*+會很貪婪(greedy)的包含儘可能多的字符。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章