获取 HTML 标记之间的文本 [重复]

Posted

技术标签:

【中文标题】获取 HTML 标记之间的文本 [重复]【英文标题】:Get text between HTML tags [duplicate] 【发布时间】:2011-08-07 16:19:14 【问题描述】:

好的,我确定这是一个非常基本的问题,但我是 php 新手,无法弄清楚。输入字符串是 $data 我试图继续拉并且只使用第一个匹配。下面是错误的吗?这甚至可能不是执行该操作的最佳方式,我只是试图将内容拉入两个 html 标记(找到的第一个集合)之间并丢弃其余数据。我知道有类似的问题,我都阅读了,我的问题是混合的,如果有更好的方法来做到这一点,以及我如何将匹配定义为其余代码的新输入。如果我将 $matches 更改为 $data2 并从那里开始使用它,它会返回错误。

preg_match('/<h2>(.*?)<\/h2>/s', $data, $matches);

【问题讨论】:

-1 在询问之前没有搜索。 tag wiki for that 中有一个条目,而 first question in the FAQ section 是 Best methods to parse HTML。这是除了hundreds of question all asking the same lame question of yours 之外的几乎每一天。 【参考方案1】:

不要通过preg_match 解析 HTML,而是使用这个 PHP 类:

The DOMDocument class

示例:

<?php 

$html= "<p>hi</p>
<h1>H1 title</h1>
<h2>H2 title</h2>
<h3>H2 title</h3>";
 // a new dom object 
 $dom = new domDocument('1.0', 'utf-8'); 
 // load the html into the object 
 $dom->loadHTML($html); 
 //discard white space 
 $dom->preserveWhiteSpace = false; 
 $hTwo= $dom->getElementsByTagName('h2'); // here u use your desired tag
 echo $hTwo->item(0)->nodeValue; 
 //will return "H2 title";
 ?>

Reference

【讨论】:

这只有在 HTML 格式合理的情况下才有效——当然应该如此。 @Erik DOM 只能解析(合理)格式良好的 HTML,这是一个神话。 loadHTML() 使用 libxml 的 HTML parser module,即(引用)能够解析“真实世界”的 HTML,即使从规范的角度来看严重损坏。 @erik,正则表达式是程序员工具包的锤子。如果您的工具包提供了更合适的工具,那么您应该使用它。在这种情况下,DOMDocument 就是那个工具(另外,我不是另一个 Gordon,只是为了弄清楚:)) 在获取元素内容这样简单的情况下,这样做真的更好吗?与正则表达式相比,domDocument 的开销是多少? phpro.org/examples/Get-Text-Between-Tags.html【参考方案2】:

使用正则表达式通常是解决问题的好主意。

当您查看http://php.net/preg_match 时,您会看到 $matches 将是一个数组,因为可能有多个匹配项。试试

print_r($matches);

了解结果的外观,然后选择正确的索引。

编辑:

如果有匹配,那么你可以得到括号组之间提取的文本

print($matches[1]);

如果您有多个括号组,它们将被编号为 2、3 等。您还应该考虑没有匹配的情况,在这种情况下,数组的大小将为 0。

【讨论】:

我用它来确保它正确地提取标签,我认为我的问题是将第一个返回值/数组定义为剩余代码的输入字符串......?跨度> 谢谢,很有帮助。你知道我如何将输出称为下一行代码的输入吗?如果我使用$matches = str_replace("Hello", "Hi", $matches); 它不起作用,我想问题是我可以成功获取并选择正确的数组,但在拉出之后我无法成功地对其应用任何进一步的代码。 只做:$data = $matches[1]; 我之前曾尝试过,但出现错误,也许它现在只能在按照您的建议选择索引后才有效,谢谢一百万,它完美无缺。【参考方案3】:

你可以这样做::

$h1 = preg_replace('/<h1[^>]*?>([\\s\\S]*?)<\/h1>/',
'\\1', $h1);

这将从&lt;H1&gt;&lt;/H1&gt; HTML 标签中剥离或展开文本

【讨论】:

效果很好,谢谢。

以上是关于获取 HTML 标记之间的文本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 grep 从本地文件中的 HTML 标记中获取文本 [重复]

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

在页面中呈现带有 HTML 标记的文本 [重复]

从字符串中删除 HTML 标记的正则表达式 [重复]

将 HTML 标记字符显示为纯文本 [重复]

正则表达式提取特定 HTML 标记中的纯文本 [重复]