【问题标题】:regarding regexp in PHP关于 PHP 中的正则表达式
【发布时间】:2013-02-25 12:54:36
【问题描述】:

我在 PHP 方面表现不错(远非专家),但在正则表达式和抓取方面却是个纯新手。我想做一些抓取来帮助进行一些研究和教育自己,但我遇到了一个问题。我想从页面的以下部分提取奖品:

<th valign="top"> Prize pool:
</th>
<td> $75,000
</td></tr>

不用说,奖池价值会发生变化。我想获得奖品,并且只获得这部分的奖品(在本例中,脚本应打印出 75,000 美元)。

这是我目前所拥有的:

preg_match('/Prize pool:\n<\/th>\n<td>(.*)/i', $file_string, $prize);

但是,这会打印出来:

Prize pool:
</th> 
<td> $75,000

【问题讨论】:

  • 虽然@JohnConde 的评论非常正确,但这里更好的答案是您应该使用php.net/domdocument 之类的东西。
  • //th[contains(text(), 'Prize pool')]/td 放入gist.github.com/1358174
  • 如果值总是一个美元符号后跟数字,你能不只搜索美元和后面的任何数字/逗号吗?
  • @gordon,也许你的意思是://th[contains(text(), 'Prize pool')]/following-sibling::td ?

标签: php regex screen-scraping


【解决方案1】:
preg_match('/Prize pool:.+(\$\d+(?:\.|,)\d+)/is', $file_string, $prize);
echo '<pre>' . print_r($prize, 1) . '</pre>';

像这样。

一点解释

. - 搜索任何单个字符,但不搜索换行符“\n”

+ - 表示一个或多个重复

所以,.+ 表示“奖池:”之后的任何字符都必须多于一个

(...)这叫口袋。正则表达式中的每个口袋都将位于数组的每个元素中 ($prize)

$ 在模式中意味着作为行尾,因此我们需要通过像这样\$ 转义来将其转换为单个字符。

\d - 表示从 0 到 9 的一个数字。而 \d+ 一个或多个数字

(?:...)这也是口袋,但不会保存在$prize中,因为我们在(之后使用了?:

我们知道. 是任何单个字符,因此要将其转换为点,我们需要将其转义为\.\.|, 意味着我们在寻找.,

/here pattern/i modificator i 这里的意思是,正则表达式不区分大小写

/here pattern/s 修饰符s 表示元字符. 将包含换行符。

【讨论】:

    【解决方案2】:

    Prize pool:\s*&lt;\/th&gt;\s*&lt;td&gt;\s+(.*)\s+&lt;\/td&gt;

    如果您只想解析 HTML 以获取此值,只需使用正则表达式;无需使用完整的 HTML 解析器从 html 字符串中捕获数字。

    使用Rubular 测试您的正则表达式。

    【讨论】:

      【解决方案3】:
      $reg = '~Prize pool:.*?td>\s*(.*?)\s*<~';
      

      rubular demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2018-03-23
        • 2011-11-14
        • 2017-02-08
        • 1970-01-01
        相关资源
        最近更新 更多