[PHP]ereg_replaceで最短一致がうまくいかない件

PHPで最短マッチングが動かない。

$str = ereg_replace('<script.*?>.*?</script.*?>', '', $str);

これがエラーになるのよ・・・。「.*?」。

<script *>~</script>」という、スタイルタグで囲まれたものの中身をereg_replaceで変換しようとしたら、最長マッチングになってしまう。
Perlでは「.*?」が最短マッチングだったけど、探していたらどうやらPHPには搭載されていないらしい。

これは困った。「php 最短一致」とかなんやかんや検索するも、なかなかみつからない。とあるサイトにあった「最長マッチングを駆使して最短マッチングを自動生成する」というようなものがあって、出た結果。

$str = ereg_replace('!<script(((((((((((((((([^<]*)*(<+[^/][^<]*)*)*)*(<+[^s][^<]*)*)*)*(<+[^c][^<]*)*)*)*
(<+[^r][^<]*)*)*)*(<+[^i][^<]*)*)*)*(<+[^p][^<]*)*)*)*(<+[^t][^<]*)*)*)*(<+[^>][^<]*)*)*</script[^>]>!is', '', $str);

いや、ありえんて・・・。長すぎ・・・。試しにやってみたけどえっらい時間かかった。

うんうん数時間唸っていて、しょうがないと思って単刀直入に「php script 除去」でしらべたらはてなで同じことをやろうとした人がおなじところで引っ掛かっていましたがな・・・。

そして、あっけなく終了。

誤→$str = ereg_replace('<script.*?>.*?</script.*?>', '', $str);
正→$str = preg_replace('!<script.*?>.*?</script.*?>!is', '', $str);

。。。

。。。

死ぬよろし!

もういやだよ。
見ての通り、ereg_replace関数じゃなくてpreg_replaceじゃないとだめなのね・・。
eregもpregも正規表現による置換ってphpマニュアルにも書いてあるのにさ!迂闊にも混同してしまった。
この一文字のためにこんなに時間を費やしてしまった・・・・・。

Trackback address for this post

Trackback URL (right click and copy shortcut/link location)

Feedback awaiting moderation

この投稿にはモデレーション待ちのフィードバックが 204 件あります....

コメントを残す


あなたのメールアドレスはこのサイト上には公開されません

頂いたURLは表示されます。
(改行が自動で <br /> になります)
(Name, email & website)
(利用者がメッセージ・フォームを用いてあなたにメール送信することを許可します (あなたのメールアドレスは公開されません)。)