Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 警告:preg_match():编译失败:在(?或(?)之后无法识别字符-_Php_Regex_Preg Match - Fatal编程技术网

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

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 preg_匹配,它抛出了一个编译错误:

$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