关于php:如何获取HTML标签的内容?

关于php:如何获取HTML标签的内容?

How to grab the contents of HTML tags?

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

1
2
3
4
5
6
7
<p>
Paragraph 1
</p><p>
Paragraph 2
</p><p>
Paragraph 3
</p>

我遇到的问题是我正在编写一个正则表达式以捕获第一个

标记和第一个结束的

标记之间的所有内容。 但是,它正在抓取第一个

标签和最后一个关闭的

标签,这导致我抓取了所有内容。

这是我当前的代码:

1
2
3
4
5
6
7
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可以让您匹配第一段中的任何内容。 您可能想要更多这样的东西

1
2
3
<p>
.*?
</p>

?放在*之后会使它变得不贪心,这意味着在匹配

之前,它只会匹配所需的尽可能少的文本。


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

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

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


使用strpos()来查找第一个的位置可能会更容易,更快。

1
 <p>

首先

1
</p>

然后使用substr()提取段落。

1
2
3
4
5
6
7
 $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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$string = <<<XML

 
  <c>texto</c>
  <c>cosas</c>
 
 <d>
  <c>código</c>
 </d>

XML
;

$xml = new SimpleXMLElement($string);

/* Busca <c> */
$resultado = $xml->xpath('//p[1]');


推荐阅读