1. 程式人生 > >第五招 PHP之正則表示式

第五招 PHP之正則表示式

定界符

界定符用來標識正則表示式的開始和結束位置,可以用斜杆(/)、花括號({})、#,筆者習慣用斜杆來標識正則表示式的位置,具體用那個看個人開發習慣。

 

可見原子

看得見的元素,如字母、數字、符號等。

 

不可見原子

看不見的元素、如空格、換行、製表符。

 

原子集合

原子集合
. 匹配除換行符之外的任意字元
\d 匹配任意一個十進位制數字,[0-9]
\D 匹配任意一個非十進位制數字,[^0-9]
\s 匹配一個不可見原子,[\f\n\r\t\v]
\S 匹配一個可見原子,[^\f\n\r\t\v]
\w 匹配任意一個數字、字母或下劃線,[0-9a-zA-Z]
\W 匹配任意一個非數字、字母或下劃線,[^0-9a-zA-Z]

 

原子篩選

原子篩選
| 匹配兩個或者多個分支
 [ ] 匹配方括號中的任意一個原子
[^] 匹配除方括號中的原子之外的任意字元

 

量詞

量詞
{n} 表示前面的原子恰好出現次
{n,} 表示前面的原子最少出現n次
{n,m} 表示前面的原子最少出現n次,最多出現m次
* 匹配0、1或者多次之前的原子{0,}
+ 匹配1次或者多次其之前的原子{1,}
? 匹配0次或者1次其之前的原子,{0,1}

 

邊界控制

邊界控制
^ 匹配字串開始的位置
$ 匹配字串結尾的位置

 

模式單元

模式單元
() 將括號內的字元作為一個整體進行匹配

 

修正模式

修正模式
U 懶惰匹配
i 忽略英文字母大小寫
x 忽略空白
s 讓 ‘.’ 匹配包括換行符在內的所有字元

 

常用字串函式解析

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int$offset = 0 ]]] )

pattern
要搜尋的模式,字串型別。

subject
輸入字串。

matches
如果提供了引數matches,它將被填充為搜尋結果。 $matches[0]將包含完整模式匹配到的文字, $matches[1] 
將包含第一個捕獲子組匹配到的文字,以此類推。

flags
flags可以被設定為以下標記值:

PREG_OFFSET_CAPTURE

 

int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

pattern
要搜尋的模式,字串形式。

subject
輸入字串。

matches
多維陣列,作為輸出引數輸出所有匹配結果, 陣列排序通過flags指定。

flags
可以結合下面標記使用(注意不能同時使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):

PREG_PATTERN_ORDER
結果排序為$matches[0]儲存完整模式的所有匹配, $matches[1] 儲存第一個子組的所有匹配,以此類推。

 

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

pattern
要搜尋的模式。可以使一個字串或字串陣列。

可以使用一些PCRE修飾符。

replacement
用於替換的字串或字串陣列。如果這個引數是一個字串,並且pattern 是一個數組,那麼所有的模式都使用這個字串進行替換。如果pattern和replacement 都是陣列,每個pattern使用replacement中對應的 元素進行替換。如果replacement中的元素比pattern中的少, 多出來的pattern使用空字串進行替換。

replacement中可以包含後向引用\\n 或$n,語法上首選後者。 每個 這樣的引用將被匹配到的第n個捕獲子組捕獲到的文字替換。 n 可以是0-99,\\0和$0代表完整的模式匹配文字。 捕獲子組的序號計數方式為:代表捕獲子組的左括號從左到右, 從1開始數。如果要在replacement 中使用反斜線,必須使用4個("\\\\",譯註:因為這首先是php的字串,經過轉義後,是兩個,再經過 正則表示式引擎後才被認為是一個原文反斜線)。

當在替換模式下工作並且後向引用後面緊跟著需要是另外一個數字(比如:在一個匹配模式後緊接著增加一個原文數字), 不能使用\\1這樣的語法來描述後向引用。比如, \\11將會使preg_replace() 不能理解你希望的是一個\\1後向引用緊跟一個原文1,還是 一個\\11後向引用後面不跟任何東西。 這種情況下解決方案是使用${1}1。 這建立了一個獨立的$1後向引用, 一個獨立的原文1。

當使用被棄用的 e 修飾符時, 這個函式會轉義一些字元(即:'、"、 \ 和 NULL) 然後進行後向引用替換。當這些完成後請確保後向引用解析完後沒有單引號或 雙引號引起的語法錯誤(比如: 'strlen(\'$1\')+strlen("$2")')。確保符合PHP的 字串語法,並且符合eval語法。因為在完成替換後, 引擎會將結果字串作為php程式碼使用eval方式進行評估並將返回值作為最終參與替換的字串。

subject
要進行搜尋和替換的字串或字串陣列。

如果subject是一個數組,搜尋和替換回在subject 的每一個元素上進行, 並且返回值也會是一個數組。

limit
每個模式在每個subject上進行替換的最大次數。預設是 -1(無限)。

count
如果指定,將會被填充為完成的替換次數。

 

mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

如果subject是一個數組,返回一個數組, 其他情況返回一個字串。

如果沒有找到匹配或者發生了錯誤,當subject是陣列 時返回一個空陣列,其他情況返回NULL。

 

array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

pattern
要搜尋的模式, 字串形式.

input
輸入陣列.

flags
如果設定為PREG_GREP_INVERT, 這個函式返回輸入陣列中與 給定模式pattern不匹配的元素組成的陣列.

 

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

pattern
用於搜尋的模式,字串形式。

subject
輸入字串

limit
如果指定,將限制分隔得到的子串最多隻有limit個,返回的最後一個 子串將包含所有剩餘部分。limit值為-1, 0或null時都代表"不限制", 作為php的標準,你可以使用null跳過對flags的設定。

flags
flags 可以是任何下面標記的組合(以位或運算 | 組合):

PREG_SPLIT_NO_EMPTY
如果這個標記被設定, preg_split() 將僅返回分隔後的非空部分。
PREG_SPLIT_DELIM_CAPTURE
如果這個標記設定了,用於分隔的模式中的括號表示式將被捕獲並返回。
PREG_SPLIT_OFFSET_CAPTURE
如果這個標記被設定, 對於每一個出現的匹配返回時將會附加字串偏移量. 注意:這將會改變返回陣列中的每一個元素, 使其每個元素成為一個由第0 個元素為分隔後的子串,第1個元素為該子串在subject 中的偏移量組成的陣列。

 

string preg_quote ( string $str [, string $delimiter = NULL ] )

str
輸入字串

delimiter
如果指定了可選引數 delimiter,它也會被轉義。這通常用於 轉義PCRE函式使用的分隔符。 / 是最常見的分隔符。