4

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

  • 阿拉拉
  • 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

当我在这里执行它时它工作正常吗?

代码有什么问题?

更新

可读的正则表达式:

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

2 回答 2

14

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

无论如何,问题在于 PHP 正在消耗 PHP 字符串的反斜杠。所以你必须用另一个反斜杠来转义所有的反斜杠。

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

另见:倾斜牙签综合症

于 2012-08-21T09:53:30.757 回答
0

我同意正则表达式看起来很丑。但是,要让它编译,您只需要更改两个实例

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

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

和两者

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

于 2012-08-21T10:08:58.360 回答