我需要在HTML字符串中选择第一个图像标记,但前提是它没有前面的文本。例如,它应匹配:
<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>
我尝试过类似的东西:
/(<[^>]+>)<img/is
这样我就可以在img标签之前选择标签,但是我无法排除img元素之前任何标签中的文本。
有些想法?
答案 0 :(得分:0)
可能是这样的
$str = '
<p><span><a href=""><img src="some1.jpg"></a></span></p>
<p><span>Text text text<a href=""><img src="some2.jpg"></a></span></p>
<p><span>Text text text<a href=""><img src="some3.jpg"></a></span></p>
<p><span><a href=""><img src="some4.jpg"></a></span></p>';
preg_match_all('#<p>\s*<span>\s*<a.*(<img[^>]+>)#U', $str, $match);
echo '<pre>' . htmlspecialchars(print_r($match, 1)) . '</pre>';
答案 1 :(得分:0)
正则表达式解决方案:
$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
。
<击> Live demo 击>
编辑#2:XPath解决方案仍然有效,但它也消除了<img>
之后文本出现的情况。由于问题暗示“前面”意味着字面上,我认为Regex是一个更好的工具。
答案 2 :(得分:0)
$content = strip_tags($yourContent, '<p><img>');
preg_match_all("#<p>(<img[^>]+>)#U", $content, $out);
print_r($out);