如何匹配没有前置文本的第一个图像元素?

时间:2013-02-22 09:57:35

标签: php html regex

我需要在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元素之前任何标签中的文本。

有些想法?

3 个答案:

答案 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)

Live demo

<击> 修改

<击>

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);