Php 警告:preg_match():编译失败:在(?或(?)之后无法识别字符-
我有一个以前的程序员编写的代码,一个regex preg_匹配,它抛出了一个编译错误:Php 警告:preg_match():编译失败:在(?或(?)之后无法识别字符-,php,regex,preg-match,Php,Regex,Preg Match,我有一个以前的程序员编写的代码,一个regex preg_匹配,它抛出了一个编译错误: $regex_t = "/" . $op . "(?\\>[^" . $op . $cl . "]+)*" . $cl . "/s"; preg_match($regex_t, $text, $inner); 我收到的警告是: 警告:preg_match():编译失败:无法识别字符 在偏移量4处(?或(?)之后 另外,我想提到的是,在var\u dump($regex\u t)中,值是: string
$regex_t = "/" . $op . "(?\\>[^" . $op . $cl . "]+)*" . $cl . "/s";
preg_match($regex_t, $text, $inner);
我收到的警告是:
警告:preg_match():编译失败:无法识别字符
在偏移量4处(?或(?)之后
另外,我想提到的是,在var\u dump($regex\u t)
中,值是:
string '/\{(?\>[^\{\}]+)*\}/s' (length=21)
出于一个奇怪的原因,程序员逃过了
(这是不需要的)
只有这些字符需要转义才能获得文字字符(字符类之外):
+模式定界符
大多数情况下,不需要转义的转义字符(或没有特殊含义的转义字符,如\b
\w
\d
..)会被正则表达式引擎忽略。但这里的情况并非如此,因为(?>
是打开原子组的固定序列,而序列(?
不允许,以下情况除外:
- 非捕获组:
(?:…)
- 原子群:
(?>…)
- 内联修饰符:
(?i)
(?-i)
- 带有内联修饰符的非捕获组:
(?i:…)
(?-i:…)
- 环顾四周:
(?=…)
(?!…)
(?)?
- 分支重置组:
(?|…|…)
- 条件测试:
(?(条件).|…)
- 对子模式的引用:
(?1)
(?-1)
(?R)
- 定义组:
(?(定义)…)
- 命名子模式:
(?…)
(?P…)
(?'John'…)
- 对命名子模式的引用:
(?&John)
(?P>John)
- 分支重置组:
(?\
未被识别为这些序列之一,这就是您获得错误的原因
也许程序员想要编写一个原子组
(?>…)
(可能是这样,因为由于该组是重复的,如果以下子模式失败,使用原子组会减少回溯),或者忘记了非捕获组的:
(?:\\
正如Avinash所建议的,但要获得文字反斜杠,需要在双引号字符串中包含四个反斜杠。很好的解释。(+1
)很好的解释,它有助于解决警告。
( ) ^ $ [ \ | . * + ?
{ # only in these cases: {n} {m,n} {m,}
# where m and n are integers