如何抓取HTML标签的内容?

How to grab the contents of HTML tags?

提问人:Andrew G. Johnson 提问时间:9/2/2008 最后编辑:Alive to die - AnantAndrew G. Johnson 更新时间:12/17/2017 访问量:1303

问:

嘿,所以我想做的是抓住第一段的内容。该字符串包含以下格式的大量段落:$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-parsing

评论


答:

1赞 Paige Ruten 9/2/2008 #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>'));

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

18赞 Kibbee 9/2/2008 #2

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

<p>.*?</p>

将 放在 your 之后使其不贪婪,这意味着在匹配 .?*</p>

6赞 Erik Öjebo 9/2/2008 #3

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

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

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

0赞 eLRuLL 12/17/2017 #4

使用正则表达式进行 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]');