如何获取HTML标签的内容?

问题描述 投票:6回答:4

嘿所以我想做的就是抓住第一段的内容。字符串$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;
php html regex html-parsing
4个回答
18
投票

那么,假设段落中没有其他html,sysrqb将允许您匹配第一段中的任何内容。你可能想要更像这样的东西

<p>.*?</p>

在你的?之后放置*使它非贪婪,这意味着在匹配</p>之前它只会匹配必要的文本。


6
投票

如果您使用preg_match,请使用“U”标志使其不贪婪。

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

然后$matches[1]将包含第一段。


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>'));

编辑:实际上其他人的答案中的正则表达式会更容易,更快......你在问题中的大复杂正则表达式让我感到困惑......


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]');
© www.soinside.com 2019 - 2024. All rights reserved.