关于PHP中的regexp

时间:2013-02-25 12:54:36

标签: php regex screen-scraping

我在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

3 个答案:

答案 0 :(得分:1)

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

喜欢这个。

一点解释

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

+ - 表示一次或多次重复

所以,.+意味着在“Prize pool:”之后必须有多个char

(...)它被称为口袋。正则表达式中的每个口袋将位于数组的每个元素($prize

中 模式中的

$表示行尾,因此我们需要将其转换为单个字符,方法是将其转换为\$

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

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

我们知道.是任何一个字符,因此要将其转换为点,我们需要将其转义为\.\.|,表示我们查找.或{{1 }}

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

i修饰符/here pattern/s表示元字符s将包含新行的字符。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

$reg = '~Prize pool:.*?td>\s*(.*?)\s*<~';

rubular demo