【问题标题】:regex , php, preg_match正则表达式,php,preg_match
【发布时间】:2010-06-15 09:46:48
【问题描述】:

我正在尝试从不同的 ebay 页面中提取里程值,但我被卡住了,因为页面有点不同,所以模式似乎太多了。因此我想知道你是否可以帮助我更好的模式。 一些项目示例如下: http://cgi.ebay.com/ebaymotors/1971-Chevy-C10-Shortbed-Truck-/250647101696?cmd=ViewItem&pt=US_Cars_Trucks&hash=item3a5bbb4100 http://cgi.ebay.com/ebaymotors/1987-HANDICAP-LEISURE-VAN-W-WHEEL-CHAIR-LIFT-/250647101712?cmd=ViewItem&pt=US_Cars_Trucks&hash=item3a5bbb4110 http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?ViewItemNext&item=250647101696
请查看以下链接中的模式(我仍然无法弄清楚如何在此处转义 html

http://pastebin.com/zk4HAY3T

但是他们似乎还不够多,因为似乎还有新的模式......

【问题讨论】:

  • 我会更多地阅读正则表达式,因为你这样做的方式肯定可以改进。它们都可以用一个正则表达式来完成,你不应该尝试匹配每个属性和 tr,而只是跳到它有英里的部分

标签: php regex preg-match


【解决方案1】:

Don't use regular expressions to parse HTML。即使对于这样一个相对简单的事情,正则表达式也会使您高度依赖于确切的标记。

您可以使用 DOMDocument 和 XPath 很好地获取值,并且它对页面中的更改更具弹性:

  $doc = new DOMDocument();

  @$doc->loadHtmlFile($url);

  $xpath = new DOMXpath($doc);
  foreach ($xpath->query('//th[contains(., "Mileage")]/following-sibling::td') as $td) {
    var_dump($td->textContent);
  }

XPath 查询搜索包含单词“Mileage”的<th>,然后选择它后面的<td>s。

然后您可以去掉 miles 后缀并使用 str_replacesubstr 去掉逗号。

【讨论】:

    【解决方案2】:

    这应该更通用一些 - 它不关心 html 标记内的内容。它适用于您提供的所有三个链接。

    /Mileage[^<]*<[^>]*><[^>]*>(.*?)\s*miles/i
    

    当然,根据您的其他限制条件,可能会有更好的方法,但这是一个很好的起点。

    认识到那里的重复,您可以(至少从逻辑上)简化一点:

    /Mileage[^<]*(?:<[^>]*>){2}(.*?)\s*miles/i
    

    您在“里程”和“英里”这两个词之间连续查找两个 html 标记。这就是(?:&lt;[^&gt;]*&gt;){2} 部分。 ?: 告诉它不要记住那个序列,因此$matches[1] 仍然包含您要查找的数字,而{2} 表示您要精确匹配前一个序列两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2014-06-28
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多