最近の、別の記事を探す
【タイトル】
うっかりミスで、はまったpreg系関数の正規表現、最短一致
【キーワード】
preg_replace_callback,正規表現,最短一致
【内容】
リンク付き画像を探すために
<a ..href="xxx"...>..<img ..src="yyyy"..>..</a>を探す処理を作った。
以下のソース
..<a ..href="xxx.jpg"><img ..src="yy.jpg"></a>..<a .. href="zzz.jpg"><img ..src="aaaa.jpg">..</a>
を以下のコードで処理すると
1組ずつ拾いたいのに2組を拾ってしまう。
【NG例】
$callback = function ($matches) {
$_POST['IMGLINK'][]=$matches[0];
};
if (NULL!==($tmp= preg_replace_callback("/<a[^>]+?href.+?<img
.+<\/a>/ui",$callback,$source))) {...}
var_dump($_POST['IMGLINK']);
【OK例】
正規表現だけ変更
"/<a[^>]+?href.+?<img
.+?<\/a>/ui"
+?href.+?<imgまでは問題なかったが、
</a>を探す所に?(最短一致)が抜けていて、最長一致(途中の最短一致は無効)で2組目の</a>までを戻していた。なぜか突然、htmlタグのペアを探すブラウザの気持ちになっていたのか?(汗)
なかなか問題に気付かず、ぐぐったら「[正規表現] .*?は最短マッチではない」と言う記事を見つけ(タイトルしか見ていません)、自分で補正する処理を作りました。?が抜けているという事は、突然閃きました。
更新日 2020-02-25