如何获取HTML标签的内容?

时间:2020-03-05 18:46:12  来源:igfitidea点击:

嗨,所以我想做的是紧紧抓住第一段的内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。字符串$ blog_post包含许多以下格式的段落:

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

我遇到的问题是我正在编写一个正则表达式来获取第一个<p>标签和第一个结束的</ p>标签之间的所有内容。但是,它抓住了第一个&lt;p>标签和最后一个闭合的&lt;/ 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;

解决方案

回答

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

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

回答

好吧,假设该段中没有其他html,sysrqb可以让我们匹配第一段中的任何内容。我们可能想要更多这样的东西

<p>.*?</p>

*之后放置会使它变得非贪婪,这意味着在匹配&lt;/ p>之前,它只会匹配所需的尽可能少的文本。

回答

如果使用preg_match,请使用" U"标志使其不贪心。

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

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