人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

正規表現でわからなくて困ってます(PHP)

<div>あああああ</div>いいいいい<div>うううう</div>ええええ<div>おおおお</div>

というテキストがあって
「<div>おおおお</div>」
を取って
最終的には
「<div>あああああ</div>いいいいい<div>うううう</div>ええええ」
としたいのですが、、

$r = preg_replace("/<div>.*?</div>$/u", "", $string);

最初これでいけるかなと思ったら
これだと先頭から末尾までマッチしちゃって$rがブランクに。。

どうやったら良いでしょうか

●質問者: spacewarp
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●200ポイント ベストアンサー

試してみましたけど、最短マッチの .*? がうまく効かないみたいですね。
こんな感じで後方参照を使うと、質問に書かれた例では期待してる結果にはなりますけど。

<?php
 ...
 $r = preg_replace('/(.*)<div>.*<\/div>$/', "$1", $string);
?>

因みに、質問に書かれた正規表現だと </div> の / は、エスケープしないとワーニングが出てるはずです。


spacewarpさんのコメント
エスケープについては実際はエスケープしておりました。 ありがとうございます。後方参照でたしかに出来ました。 「 .*? 」がうまく効かないというより、先頭の<div>がまずマッチしちゃってるだけで「 .*? 」は効いてるような気もします なので後方参照でも、途中の「<div>うううう....」からマッチして 「<div>あああああ</div>いいいいい」 となりそうな気もするのですが ちゃんと「<div>あああああ</div>いいいいい<div>うううう</div>ええええ」 となるのが逆に不可解ではあります。

a-kuma3さんのコメント
回答で書いた方は、最初の .* が極力長い文字列にマッチするので、正規表現中の &lt;/div&gt; は、文字列の中の一番最後の方にあるものにマッチします。 .*? は、最短一致なのでうまくいきそうな気もするけど .* が強いんだろうなあ... 追加で、後方参照を使わないパターンをひとつ。 >|php| <?php ... $r = preg_replace('/<(?!.*<div>).*/u', "", $string); ?> ||<

spacewarpさんのコメント
「最初の .* が極力長い文字列にマッチする」んですね?。 そう考えると納得が行きます。 追加のパターンもありがとうございます。参考にさせていただきます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ