我在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
答案 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*<~';