preg_replace_callbackは入れ子にできる

preg_replace_callbackは入れ子にできる

preg_replace_callbackのコールバック関数の中で、preg_replace_callbackを呼ぼうとしたときの話。

preg_replace_callbackのコールバック関数の中で、preg_replace_callbackを呼ぶことは、普通にできます。

はじめ、以下のような処理を書いていまして、

$body_html = '<a href="#"><img src="#" width="190" class="a"><span>AAA</span></a>';
$body_html .= "<p><img src='http://danroo.com' width='190' class='abc' /></p>";
$a = preg_replace_callback('/<img[^>]+>/i', function($img) {
        return preg_replace_callback('/class=("[^"]*")/i', function($tag) {
                var_dump($tag);
        }, $img[0]);
}, $body_html);

結果がこちらでした。

array(2) {
  [0]=>
  string(9) "class="a""
  [1]=>
  string(3) ""a""
}

なんで、class=’abc’ が出力されないのだろう?

入れ子はできないの?と思ったりしたのですが、

class=”a” と class=’abc’ の違いはダブルコーテーションかシングルコーテーションかの違いで、
正規表現にヒットしなかったから、var_dumpで出力されなかっただけだった。

以下のようにダブルコーテーションで統一したり、

$body_html = '<a href="#"><img src="#" width="190" class="a"><span>AAA</span></a>';
$body_html .= '<p><img src="http://danroo.com" width="190" class="abc" /></p>';
$a = preg_replace_callback('/<img[^>]+>/i', function($img) {
        return preg_replace_callback('/class=("[^"]*")/i', function($tag) {
                var_dump($tag);
        }, $img[0]);
}, $body_html);

正規表現を「’/class=[\”\’]([^\s]*)[\”\’]/’」とかに変更したら、ちゃんと出力されました。

$body_html = '<a href="#"><img src="#" width="190" class="a"><span>AAA</span></a>';
$body_html .= "<p><img src='http://danroo.com' width='190' class='abc' /></p>";
$a = preg_replace_callback('/<img[^>]+>/i', function($img) {
        return preg_replace_callback('/class=[\"\']([^\s]*)[\"\']/', function($tag) {
                var_dump($tag);
        }, $img[0]);
}, $body_html);

だったこれだけのことなんだけど、入れ子できないのではないかと調べたりしてしまった。
求める情報は1件も見つけられなかったのだが・・

Web技術カテゴリの最新記事