本文主要和大家分享PHP正規符合所有字元失敗的原因及解決辦法,希望能幫助大家。
<?php$str = ' @@@@i ( PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。@@@@ m ( PCRE_MULTILINE)';// 正则1:$preg = '/@@@@(.*)@@@@/'; 无法匹配换行符\n// 正则2:$preg = '/@@@@(.*)@@@@/s';// \s 匹配任意一个空白符,等价于[\f\n\r\t\v]// \S 匹配除空白符以外任何字符,等价于[^\f\n\r\t\v]preg_match_all( $preg, $str, $matches); print_r($matches);// 结果1:Array( [0] => Array() [1] => Array() )// 结果2:Array( [0] => Array ( [0] => @@@@i ( PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。@@@@ ) [1] => Array ( [0] => i ( PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。 ) )
i:如果設定了這個修飾符, 模式中的字母會進行大小寫不敏感比對.
m:預設情況下, PCRE認為目標字串是由單行字元組成的(然而實際上它可能會包含多行), “行首”元字符(^)僅匹配字符字串的開始位置, 而」行末」元字元(
, 設定這個修飾符不產生任何影響.
s:如果設定了這個修飾符, 模式中的點號元字元符合所有字元, 包含換行符. 如果沒有這個修飾符, 點號不符合換行符. 這個修飾符等同於perl中的/s修飾符.一個取反字符類別比如[^a]總是匹配換行符, 而不依賴於這個修飾符的設置.
x:如果設置了這個修飾符, 模式中的沒有經過轉義的或不在字符類中的空白數據字符總會被忽略, 並且位於一個未轉義的字符類外部的#字符和下一個換行符之間的字符也被忽略. 這個修飾符等同於perl中的/x修飾符, 使被編譯模式中可以包含註釋. 注意: 這僅用於數據字符. 空白字符還是不能在模式的特殊字符序列中出現, 比如序列( ?(引入了一個條件子組(譯註: 這種語法定義的特殊字符序列中如果出現空白字符會導致編譯錯誤. 例如( ?(就會導致錯誤.).
#e :如果這個修飾符設定了, preg_replace()在進行了對替換字串的後向引用替換之後, 將替換後的字串作為php程式碼評估執行(eval函數方式), 並使用執行結果作為實際參與替換的字串. 單引號, 雙引號, 反斜線()和NULL字元在後向引用替換時會被用反斜線轉義.
Tip 请确保replacement参数由合法php代码字符串组成, 否则php将会 在preg_replace()调用的行上 产生一个解释错误. Note: 仅 preg_replace()使用此修饰符, 其他PCRE函数忽略此修饰符.
A :如果設定了這個修飾符, 模式被強制為」錨定」模式, 也就是說約束匹配使其僅從目標字串的開始位置搜尋. 這個效果同樣可以使用適當的模式構造出來,並且這也是perl種實現這種模式的唯一途徑.
D:如果這個修飾符被設定, 模式中的元字元美元符號僅僅匹配目標字串的結尾. 如果這個修飾符沒有設定, 當字串以一個換行符號結尾時, 美元符號還會匹配該換行符(但不會匹配之前的任何換行符). 如果設定了修飾符m, 這個修飾符被忽略. 在perl中沒有與此修飾符等同的修飾符.
S:當一個模式需要多次使用的時候, 為了得到匹配速度的提升, 值得花費一些時間對其進行一些額外的分析. 如果設定了這個修飾符, 這個額外的分析就會執行. 當前, 這種對一個模式的分析僅僅適用於非錨定模式的匹配(即沒有單獨的固定開始字符).
#U :這個修飾符逆轉了量詞的」貪婪」模式. 使量詞默認為非貪婪的, 通過量詞後緊跟?的方式可以使其成為貪婪的. 這和perl是不相容的. 它同樣可以使用模式內修飾符設定(?U)進行設定, 或在量詞後以問號標記其非貪婪(比如.*?).
Note: 在非贪婪模式, 通常不能匹配超过 pcre.backtrack_limit的字符.
以上是PHP正規符合所有字元失敗的原因及解決辦法的詳細內容。更多資訊請關注PHP中文網其他相關文章!