警告:preg_match():编译失败:(?或(? - )后无法识别的字符

时间:2015-02-21 13:42:30

标签: php regex preg-match

我有一个由前一个程序员编写的代码,一个正在引发编译错误的正则表达式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)

1 个答案:

答案 0 :(得分:11)

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

只需要转义这些字符才能获得文字字符(在字符类之外)

( ) ^ $ [ \ | . * + ?

{   # 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)

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

也许程序员想要编写一个原子组(?>...) (可能就是这种情况,因为自从重复该组后,如果以下子模式失败,使用原子组会减少回溯)或者忘记了非捕获组:的{​​{1}},正如Avinash所说的那样,但要获得字面反斜杠,您需要在双引号字符串中使用四个反斜杠。