アプリ版:「スタンプのみでお礼する」機能のリリースについて

$dat = 'ab,cd,e\,f,gh';
$dats = preg_split('/(?<!\\\),/', $dat);
print_r($dats);
exit;

結果

Array
(
[0] => ab
[1] => cd
[2] => e\,f
[3] => gh
)

,で区切った文字が必要なのですが、\でエスケープした場合は,で区切らないという処理が欲しくて、ネット上を探して上記のようなサンプルを見つけたのですが、パターンの部分が名にをしているのか分かりません。

だれか解説してもらえないでしょうか?

A 回答 (2件)

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つを組み合わせると今回のものになります。
(?<!\\\), ・・・「\マーク」の直後にない「,」にマッチ

この回答への補足

求めていた完璧な答えです。ありがとうございます。

ただ、一つ疑問が残っていて、
「\」の正規表現は\\なのではないでしょうか?

もし「\\」が欲しい場合は\\\\のよう二思うのですが、
なぜ3つなのでしょうか?

補足日時:2010/03/01 16:17
    • good
    • 0

print $pattern='/\\/';


すると「/\/」が表示されます。それをパターンにつかうと
「\/」がエスケープと勘ちがいされて終端のデリミターが不適合に
なるからじゃないですかねぇ・・・

実際のところpatternはpreg_quote()した方がよいので
$pattern='/'.preg_quote('\\').'/';
とすると、
$pattern='/\\\/';
と同等になるのだと思います。
(ホントは$pattern='/\\\\/'なのかも・・・)
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/03/01 19:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!