【问题标题】:PHP preg_match_all - group without returning a matchPHP preg_match_all - 分组而不返回匹配
【发布时间】:2012-03-23 00:32:59
【问题描述】:

如何从具有类 pricebox 的元素内的 h3 标记之间的 HTML 获取内容?比如下面的字符串片段

<!-- snip a lot of other html content -->
<div class="pricebox">
    <div class="misc_info">Some misc info</div>
    <h3>599.99</h3>
</div>
<!-- snip a lot of other html content -->

catch is 599.99 必须是返回的第一个匹配项,即如果函数调用是

preg_match_all($regex,$string,$matches)

599.99 必须在 $matches[0][1] 中(因为我使用相同的脚本从具有不同 $regex 的不同外观字符串中获取数字 - 脚本查找第一个匹配项)。

【问题讨论】:

  • 认真的吗?再次? Parsing HTML with regular expressions?
  • 试试这个 dom 操作simplehtmldom.sourceforge.net php 也有一些很棒的 dom 操作支持。大多数优秀的程序员不建议将正则表达式用于 dom pars
  • 嗯,你指出的答案听起来有点歇斯底里。 HTML 只是一个字符串,它并不神奇,我需要在子字符串 'class="pricebox"' 之后出现的第一对 h3 标记(同样只是字符串)之间进行匹配。
  • 谢谢 Mian,这听起来很有用,但我需要一些独立于进行解析的实际 PHP 的东西 - 我将正则表达式粘贴到 CMS 中,脚本使用该正则表达式来获取数据。跨度>

标签: php html regex html-parsing


【解决方案1】:

尝试使用XPath;绝对不是正则表达式

代码:

$html = new DOMDocument();
@$html->loadHtmlFile('http://www.path.to/your_html_file_html');

$xpath = new DOMXPath( $html );
$nodes = $xpath->query("//div[@class='pricebox']/h3");

foreach ($nodes as $node)
{
    echo $node->nodeValue."";
}

【讨论】:

  • 谢谢,我去看看。我需要的是能够将匹配模式粘贴到 CMS 中并让脚本处理它,而无需以任何方式更改脚本以获取完全不同的字符串。这看起来很有希望。
  • @DMIL 对于有关 HTML 解析的可自定义查询字符串,XPath 绝对是要走的路...(而且它真的很容易理解;并且比RegEx 更容易处理... )
  • 但是如果在“

    ”标签之间有“

    only $599.99

    ”这样的内容呢?我如何使用 Xpath 获得该数字?我不能使用 Xpath,然后使用正则表达式,因为需要在 CMS 的文本字段中输入获得数字的任何模式。我想我可以有两个字段,一个用于 Xpath 模式,另一个用于正则表达式以清理 Xpath 返回的任何内容,但是......这也很麻烦......
  • @DMIL 好吧,XPath 所做的只是遍历... HTML 树结构的“分支”并获取其值...例如/html/body/div/p/div/h3。不要将它与 RegEx 混淆。在您的示例中,XPath 将返回 only $599.99,而获得只是数值将是一个完全不同的问题(那个问题,可能需要 RegEx ...)。好像很蛋疼?大概。但是,它仍然更简单,因为您将使用不同的编码技术来实现它们的“设计”目的...... ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2015-12-24
相关资源
最近更新 更多