2

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

<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
4

3 回答 3

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这里的修饰符i意味着,正则表达式不会不区分大小写

/here pattern/s修饰符s意味着元字符.将包含换行符的字符。

于 2013-02-25T13:28:23.770 回答
0

Prize pool:\s*<\/th>\s*<td>\s+(.*)\s+<\/td>

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

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

于 2013-02-25T13:03:27.837 回答
0
$reg = '~Prize pool:.*?td>\s*(.*?)\s*<~';

rubular 演示

于 2013-02-25T13:06:38.553 回答