2012-03-02 15 views
0

私は非常に複雑な正規表現を書いていて、Rubular editorを使ってテストしましたが、数時間後にはPHPで動作しないことに気付きました。正当な正規表現はphp((\\ | \ |)| [^ \ |]))*で動作しません。

これは長い正規表現パターンのほんの一部です:

((\\\\|\\\|)|[^\\\|])*? 

私は、以下の条件の下で、文字列をMACHする必要があります。

  1. 文字列には|文字だけが\|にエスケープされている場合があります。
  2. 文字列に\の文字が含まれている場合は、\\としてエスケープされます。
  3. 文字列が空である可能性があります。

これはまた、Rubularは[^\\\|]とを受け入れ

test 
test\\ 
test\| 
t\\e\|s\|\|t\\\\\\\\\\ 

のような文字列がCORRECTあり、そして

test\ 
test|\ 
\ 
| 
test\\\\| 

のような文字列が

CORRECT されていないことを意味し(同じ)。 PHPは[^\|\\]で動作しません。どうして?

ここには何も表示されていませんが、私は両方の文字が正しくエスケープされていると思いますが、PHPは私に同意しないと思うからです。

See this example in Rubular

私は、この正規表現のことで、まだ新しいですので、私の愚かさを非難しないでください。

ありがとうございます!

+0

生の文字列を使用するように思えます。 'var_export($ yourRegexString、true);を渡していますか? – dangerChihuahua007

答えて

4

PHPで引用するときに\をエスケープする必要があります。

regex = "/((\\\\\\\\|\\\\\\|)|[^\\\\\\|])*?/"; 
+0

@ Wh1T3h4Ck5、お手伝いできるように、使用しているコードを表示してください。式を '^'と '\ z'または' $ 'でアンカーしたいと思うかもしれません。 – Qtax

+0

はい、私の悪いです。テスト文字列でいくつかのスラッシュをエスケープしていないし、今はうまくいくようです。それが問題を引き起こしたかどうかを調べるために完全なパターンでテストしますか?完全なパターンは、このようになります。/(\ [([az] [a-z0-9] *〜)|(〜[az] [a-z0-9] *(\ |([az] [a- z0-9] *(=(((\\\\\\\\\\\\\\\\\\\\\\\\\\\) ?))])/ i''ですが、他の部分は既にテストされていますが、これは問題がありました。しかし、あなたの答えは正しいです、それは私が探していたものです。どうもありがとう。 – Wh1T3h4Ck5