2008-09-02 225 views
6

嘿所以我想要做的就是抓住第一段的內容。該字符串$blog_post包含以下格式有很多段落:如何獲取HTML標籤的內容?

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p> 

我遇到的問題是,我寫一個正則表達式的第一<p>標籤和第一閉合</p>標籤之間搶的一切。然而,它抓住了第一個<p>標籤和最後關閉</p>標籤,這導致我抓住一切。

這裏是我當前的代碼:

if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph)) 
    echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>"; 
else 
    echo $blog_post; 

回答

18

好,sysrqb會讓你匹配任何在第一段中假設段落中沒有其他html。您可能需要更多的東西像這樣

<p>.*?</p> 

配售?*使它非貪婪之後,這意味着它只會匹配匹配</p>之前需要儘可能少的文字。

1

它可能是更容易和更快地使用strpos()找到的第一

<p> 

的位置和第一

</p> 

然後使用substr()來提取該段落。

$paragraph_start = strpos($blog_post, '<p>'); 
$paragraph_end = strpos($blog_post, '</p>', $paragraph_start); 
$paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>')); 

編輯:其實在別人的答案,正則表達式會更容易和更快......在這個問題你的大複雜的正則表達式搞糊塗了......

6

如果您使用preg_match,請使用「U」標誌使其變爲非貪婪。

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches); 

$matches[1]將包含第一段。

0

使用正則表達式進行html解析永遠不是正確的解決方案。對於這種特殊情況,您應該使用XPATH:

$string = <<<XML 
<a> 
<b> 
    <c>texto</c> 
    <c>cosas</c> 
</b> 
<d> 
    <c>código</c> 
</d> 
</a> 
XML; 

$xml = new SimpleXMLElement($string); 

/* Busca <a><b><c> */ 
$resultado = $xml->xpath('//p[1]'); 
相關問題