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件も見つけられなかったのだが・・