PHP正则匹配所有字符失败的原因及解决办法

小云云
小云云 原创
2023-03-22 21:40:01 2119浏览

本文主要和大家分享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)
如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。
        )

)

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核实处理。