【问题标题】:Warning: preg_match(): Compilation failed: unrecognized character after (? or (?-警告:preg_match():编译失败:(? 或 (?-
【发布时间】:2015-02-21 13:42:30
【问题描述】:

我有一个由以前的程序员编写的代码,一个引发编译错误的正则表达式 preg_match:

$regex_t = "/" . $op . "(?\\>[^" . $op . $cl . "]+)*" . $cl . "/s";
preg_match($regex_t, $text, $inner);

我收到的警告是:

警告:preg_match():编译失败:无法识别的字符 在 (? 或 (?- 偏移 4 处) 之后

另外,我想提一下 var_dump($regex_t) 的值是:

string '/\{(?\>[^\{\}]+)*\}/s' (length=21)

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    出于一个奇怪的原因,程序员已经逃脱了> (这是永远不需要的)

    只需要对这些字符进行转义即可获得文字字符(在字符类之外)

    ( ) ^ $ [ \ | . * + ?
    
    {   # only in these cases: {n} {m,n} {m,}
        # where m and n are integers
    

    + 模式分隔符

    大多数时候,不需要转义的转义字符(或者没有像 \b \w \d ... 之类的特殊含义的转义字符)会被正则表达式引擎简单地忽略。但是这里不是这样,因为(?>是一个固定的序列打开一个原子群,除了这些情况之外,不允许使用序列(?

    • 非捕获组:(?:...)
    • 一个原子团:(?>...)
    • 内联修饰符:(?i) (?-i)
    • 带有内联修饰符的非捕获组:(?i:...)(?-i:...)
    • 环顾四周:(?=...)(?!...)(?<=...)(?<!...)
    • 一个分支重置组:(?|...|...)
    • 条件测试:(?(condition)...|...)
    • 对子模式的引用:(?1) (?-1) (?R)
    • 定义组:(?(DEFINE)...)
    • 一个命名的子模式:(?<John>...)(?P<John>...)(?'John'...)
    • 对命名子模式的引用:(?&John) (?P>John)

    所以(?\ 未被识别为这些序列之一,这就是您获得错误的原因。

    也许程序员想写一个原子组(?>...) (可能是这种情况,因为由于组是重复的,如果以下子模式失败,使用原子组可以减少回溯)或正如 Avinash 所建议的那样,已经忘记了非捕获组 (?:\\:,但是要获得文字反斜杠,您需要在双引号字符串中使用四个反斜杠。

    【讨论】:

    • 很好的解释。 (+1)
    • 很好的解释,它有助于解决警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多