preg_match“编译失败:丢失)”

时间:2012-08-21 09:49:01

标签: php regex preg-match

它可能是一个愚蠢的错误,但我有一个正则表达式应该匹配

  • allalaa
  • afkdsf []
  • afadf43fds [ “guyish”]

但不是以数字

开头的字符串

这是代码

preg_match('~^[A-Za-z][A-Za-z0-9]*(\[(?P<array>"(?:.*(?:(?<!\\)(?>\\\\)*\").*|.*)+(?:(?<!\\)(?>\\\\)*"))\]|\[\]|)$~',trim($item[0],"    \r"),$matches)

但是当我执行它时,我收到错误Compilation failed: missing ) at offset 95

当我执行它时here它运行正常吗?

代码有什么问题?

更新

可读的正则表达式:

~
   ^
   [A-Za-z]
   [A-Za-z0-9]*
   (
      \[
      (?P<array>
      "
      (?:
          .*
          (?:
             (?<!\\)
             (?>\\\\)*
             \"
           )
           .*
        |
           .*
        )+
        (?:
           (?<!\\)
           (?>\\\\)*
           "
         )
       )
       \]
     |
     \[\]
     |
   )$
~x

2 个答案:

答案 0 :(得分:13)

这个正则表达式很疯狂。我很难相信你真的需要这么复杂的一个。

无论如何,问题是PHP正在使用PHP字符串的反斜杠。所以你必须用另一个反斜杠来逃避所有反斜杠。

考虑到你已经拥有的反斜杠的数量,你可能会有点疯狂。

另请参阅:Leaning toothpick syndrome

答案 1 :(得分:0)

我同意正则表达式看起来很难看。但是,要使其编译,您只需要更改

的两个实例
(?<!\\)(?>\\\\)*

(?<!\\\\)(?>\\\\\\\\)*

和两者

但我不相信这个正则表达式可靠地工作。我的口味太多.*