0

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

有些想法?

4

3 回答 3

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.

现场演示

编辑#2:XPath 解决方案仍然有效,但它也消除了文本后跟的情况<img>。由于问题暗示“preceding”的意思是字面意思,我认为 Regex 是一个更好的工具。

于 2013-02-22T10:20:20.140 回答
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>';
于 2013-02-22T10:17:31.203 回答
0
$content = strip_tags($yourContent, '<p><img>');
preg_match_all("#<p>(<img[^>]+>)#U", $content, $out);
print_r($out);
于 2013-02-22T10:24:10.480 回答