• ベストアンサー

PHPの正規表現の/(?<!\\\),/が分からない。

$dat = 'ab,cd,e\,f,gh'; $dats = preg_split('/(?<!\\\),/', $dat); print_r($dats); exit; 結果 Array ( [0] => ab [1] => cd [2] => e\,f [3] => gh ) ,で区切った文字が必要なのですが、\でエスケープした場合は,で区切らないという処理が欲しくて、ネット上を探して上記のようなサンプルを見つけたのですが、パターンの部分が名にをしているのか分かりません。 だれか解説してもらえないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

2つの問題がかぶっているためわかりにくくなっています。 まず「\\\」というのは「\」のことです。 $dat = 'abc\mno\xyz'; $pattern ='/\\\/'; $dats = preg_split($pattern, $dat); print_r($dats); つぎに「(<!abc)xyz」というのは否定後読みという機能です。 この場合abcの後に続かないxyzにマッチします。 $pattern ='/(?<!abc)xyz/'; $dat = 'abcxyz'; print $dat; if(preg_match($pattern,$dat)) print "OK<br>" ;else print "NG<br>"; $dat = 'abxyz'; print $dat; if(preg_match($pattern,$dat)) print "OK<br>" ;else print "NG<br>"; その2つを組み合わせると今回のものになります。 (?<!\\\), ・・・「\マーク」の直後にない「,」にマッチ

abu_kame
質問者

補足

求めていた完璧な答えです。ありがとうございます。 ただ、一つ疑問が残っていて、 「\」の正規表現は\\なのではないでしょうか? もし「\\」が欲しい場合は\\\\のよう二思うのですが、 なぜ3つなのでしょうか?

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

print $pattern='/\\/'; すると「/\/」が表示されます。それをパターンにつかうと 「\/」がエスケープと勘ちがいされて終端のデリミターが不適合に なるからじゃないですかねぇ・・・ 実際のところpatternはpreg_quote()した方がよいので $pattern='/'.preg_quote('\\').'/'; とすると、 $pattern='/\\\/'; と同等になるのだと思います。 (ホントは$pattern='/\\\\/'なのかも・・・)

abu_kame
質問者

お礼

とても参考になりました。ありがとうございまいた。

関連するQ&A