题
嘿,所以我想做的是获取第一段的内容。字符串 $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;
解决方案
好吧,假设该段落中没有其他 html,sysrqb 会让您匹配第一段中的任何内容。你可能想要更多这样的东西
<p>.*?</p>
放置 ?
在你之后 *
使其变得非贪婪,这意味着在匹配之前它只会匹配尽可能少的文本 </p>
.
其他提示
如果你使用 preg_match
, , 使用 “你” 标记以使其不贪婪。
preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
$matches[1]
然后将包含第一段。
使用起来可能会更容易、更快 strpos() 找到第一个的位置
<p>
首先
</p>
然后使用 子字符串() 提取该段落。
$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>'));
编辑: 实际上其他人答案中的正则表达式会更容易、更快......你的问题中复杂的正则表达式让我很困惑......
使用正则表达式进行 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]');
不隶属于 StackOverflow