嘿所以我想做的就是抓住第一段的内容。字符串$blog_post
包含以下格式的许多段落:
<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;
答案 0 :(得分:18)
好吧,假设段落中没有其他html,sysrqb会让你匹配第一段中的任何内容。你可能想要更像这样的东西
<p>.*?</p>
在?
之后放置*
使其变得非贪婪,这意味着在匹配</p>
之前,它只会匹配尽可能少的文字。
答案 1 :(得分:6)
如果您使用preg_match
,请使用“U”标志使其不贪婪。
preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
$matches[1]
将包含第一段。
答案 2 :(得分: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>'));
编辑:实际上其他人答案中的正则表达式会更容易,更快......你在问题中的大复杂正则表达式让我感到困惑......
答案 3 :(得分: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]');