首頁  >  文章  >  後端開發  >  PHP正規符合所有字元失敗的原因及解決辦法

PHP正規符合所有字元失敗的原因及解決辦法

小云云
小云云原創
2018-03-31 14:31:302484瀏覽

本文主要和大家分享PHP正規符合所有字元失敗的原因及解決辦法,希望能幫助大家。

<?php$str = &#39;
@@@@i ( PCRE_CASELESS)
如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。@@@@
m ( PCRE_MULTILINE)&#39;;// 正则1:$preg = &#39;/@@@@(.*)@@@@/&#39;; 无法匹配换行符\n// 正则2:$preg = &#39;/@@@@(.*)@@@@/s&#39;;// \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)
如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。
        )

)

PHP正規表示式修飾符:

  • 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的字符.
###X :這個修飾符打開了PCRE與perl不相容的附件功能. 模式中的任意反斜線後就ingen一個沒有特殊含義的字符都會導致一個錯誤, 以此保留這些字符以保證向後兼容性. 默認情況下,在perl中, 反斜線緊跟著一個沒有特殊意義的字元被認為是該字元的原文. 目前沒有其他特性由這個修飾符控制.############J:內部選項設置(?J)修改本地的PCRE_DUPNAMES選項. 允許子組重名. (譯:只能透過內部選項設定, 外部的/J設定會產生錯誤.)############u:此修正符號開啟一個與perl不相容的附加功能. 模式字串被認為是utf-8的. 這個修飾符從unix版php 4.1.0或更高, win32版php 4.2.3開始可用. php 4.3. 5開始檢視模式的utf-8合法性。 ##########

以上是PHP正規符合所有字元失敗的原因及解決辦法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn