正则表达式解决方案:
$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>
。由于问题暗示“preceding”的意思是字面意思,我认为 Regex 是一个更好的工具。