【问题标题】:Scrape a price off a website从网站上刮下价格
【发布时间】:2008-11-29 15:28:29
【问题描述】:

我正在尝试使用 PHP 和正则表达式从网页中获取价格。价格格式为 123.12 英镑或 123.12 美元(即英镑或美元)。

我正在使用 libcurl 加载内容。然后其输出将进入preg_match_all。所以看起来有点像这样:

$contents = curl_exec($curl);

preg_match_all('/(?:\$|£)[0-9]+(?:\.[0-9]{2})?/', $contents, $matches);

到目前为止很简单。问题是,PHP 根本不匹配任何东西——即使页面上有价格。我已将其范围缩小到“£”字符存在问题 - PHP 似乎不喜欢它。

我认为这可能是字符集问题。但无论我做什么,我似乎都无法让 PHP 匹配它!有人有什么想法吗?

(编辑:我应该注意,如果我尝试使用相同的正则表达式和页面内容使用Regex Test Tool,它可以正常工作)

【问题讨论】:

    标签: php regex character-encoding


    【解决方案1】:

    你有没有尝试在£前面使用\

    preg_match_all('/(\$|\£)[0-9]+(\.[0-9]{2})/', $contents, $matches);
    

    我已经用 .Net 和 \£ 尝试过这个表达式,它可以工作。我刚刚对其进行了编辑并删除了一些“:”。
    (来源:clip2net.com

    阅读我关于 Curl 可能给你错误编码的评论(这篇文章的评论)。

    【讨论】:

    • 我已经编辑了正则表达式并删除了一些其他内容。检查屏幕截图。你确定这不是你在正则表达式之后使用匹配的方式吗?
    • 我刚刚注意到您的编辑。如果正则表达式工作正常,则可能是 curl 中的页面编码会给您带来 $ 和 £ 的一些编码问题。你可能想输出 curl 数据来检查它。
    • 是的,原来 curl 提供了 ISO-8859-1 编码,这显然是 PHP 不喜欢的。转换为 UTF-8 似乎可行。
    【解决方案2】:

    也许磅有它的 html 实体替换?我认为您应该使用某种沙发程序尝试您的正则表达式(即将其与本地固定文本匹配)。

    我会像这样更改我的正则表达式:'/(?:\$|£)\d+(?:\.\d{2})?/'

    【讨论】:

    • 谢谢 - 我尝试将其保存在本地,但在打开文件时出现错误。如果我将字符串转换为 utf8,它可以工作!所以我想我只需要检测字符集。
    【解决方案3】:

    这应该适用于简单的值。

    '#(?:\$|\£|\€)(\d+(?:\.\d+)?)#'
    

    这不适用于千位分隔符,例如 234,343 和 34,454.45。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多