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 に答える