趣味のPHP |→お問い合わせ趣味のPHP
  1. ホーム
  2. 失敗から学ぶPHP
《記事番号:51》 2020-02-25 16:49:47
最近の、別の記事を探す

【タイトル】
うっかりミスで、はまった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
検索


OR検索AND検索
検索方法の違い


更新履歴
追加・更新されたブロックの内容を自動的に表示しています。
メニュー
このサイトは
XOOPSのブロック管理の考え方を参考にして作った自作ツールで作成しています。

このサイトは、全ページどのページからでもリンクフリーです。
このサイトは
 2023/1/6から、このサイトを「パソコンよろず攻防」から「趣味のPHP」に変更しました。過去の記事に現れる、パソコンよろず攻防の文言はそのままにしてあります。
PHPのバージョンアップ