获取 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 格式合理的情况下才有效——当然应该如此。 @ErikDOM
只能解析(合理)格式良好的 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);
这将从<H1></H1>
HTML 标签中剥离或展开文本
【讨论】:
效果很好,谢谢。以上是关于获取 HTML 标记之间的文本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 grep 从本地文件中的 HTML 标记中获取文本 [重复]