正規表現ソリューション:
$regex='#^(<[^>]+>)*<img#i';
var_dump(preg_match($regex,'<p><span><a href=""><img src="some.jpg"></a></span></p>'));
var_dump(preg_match($regex,'<p>Text text text<span><a href=""><img src="some.jpg"></a></span></p>'));
var_dump(preg_match($regex,'<p><span>Text text text<a href=""><img src="some.jpg"></a></span></p>'));
出力:
int(1)
int(0)
int(0)
ライブデモ
編集:
DOM / XPathソリューション:
foreach(array('<p><span><a href=""><img src="some.jpg"></a></span></p>',
'<p>Text text text<span><a href=""><img src="some.jpg"></a></span></p>',
'<p><span>Text text text<a href=""><img src="some.jpg"></a></span></p>') as $html)
{
$dom=new DOMDocument();
$dom->loadHTML($html);
$xpath=new DOMXPath($dom);
var_dump($xpath->query('//img[string-length(//text())<=0]')->length);
}
また、を出力します1,0,0
。
ライブデモ
編集#2:XPathソリューションは引き続き機能しますが、テキストが後に続く状況も排除しました<img>
。質問は「前に」が文字通り意味することをほのめかしたので、私は正規表現がここでより良いツールであると思います。