2013-02-22 133 views
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> 

我tryed類似:

/(<[^>]+>)<img/is 

這樣我就可以選擇標籤img標籤,但我無法排除可位於img元素之前的任何標籤中的文本。

有些想法?

回答

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>後的文本來的情況。由於這個問題暗示「之前」的意思是字面上,我認爲正則表達式在這裏是一個更好的工具。

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>'; 
0
$content = strip_tags($yourContent, '<p><img>'); 
preg_match_all("#<p>(<img[^>]+>)#U", $content, $out); 
print_r($out); 
相關問題