チョコミントアイス

$string = 'ああああ\|ああああ|ああああ';
$result = preg_split("/[^\\]\|/",$string);

「\|」はpreg_splitの対象文字列としたくないので、
「"/[^\\]\|/"」としましたが、これだと「あ|」で分割されてしまいます。

いろいろ考えているのですが、答えにたどりつけずにおります。。。

A 回答 (2件)

否定戻り読みですね、こうします。



<?PHP
$string = 'ああああ\|ああああ|ああああ';
$pattern="/(?<!\\\\)\|/";
$result = preg_split($pattern,$string);
print_r($result);
?>

ちょっとわかりにくいですが、|はorですからエスケープして\|
\マークはエスケープしてさらにエスケープするので
\\\\と4つ重ねます。
    • good
    • 0
この回答へのお礼

「否定戻り読み、肯定戻り読み、否定先読み、肯定先読み」
このどれも知らない言葉でした。
ありがとうございました。これで前へ進むことができます。

まだ理解できておらず、"/(?<!\\)\|/"←こうしてしまいそうですが、ここからは自分で調べていきたいと思います。

ありがとうございました。

お礼日時:2012/02/07 19:25

残念ながら一発で解決するようなかっこいい方法は浮かびませんでした。


泥臭い方法ですが、もとの文字列のややこしい部分を通常は出現しないような文字または文字列で一旦置き換えて後で元に戻すとよいかも。
通常は出現しないような文字または文字列の例を3つ:
1 \t
2 文字コード表の端っこにあるようななんだか変な文字
3 _#_#&@_#9_!8_
あなたが開発するアプリに合わせて出現しないはずの文字または文字列を決めればよいでしょう。
仮にそれがxであるとしたら大まかな流れは次の通り。
(A) 元の文字列 ああああ\|ああああ|ああああ を ああああxああああ|ああああ に一旦変換。
(B) preg_split()を使って | で分割。
(C) 分割後の全ての分割片で x を \| に戻す。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

私も同じ事を考えていたのですが、数百万行もある1Gくらいのテキスト処理のためなんとかスマートにやれる方法を探しています。

お礼日時:2012/02/07 18:58

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