2008-09-02 170 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]'); 
相关问题