有一个网站,我想获得所有<td> (any content) </td>
模式字符串
所以我这样写:
preg_match("/<td>.*</td>/", $web , $matches);
die(var_dump($matches));
返回null,如何解决问题?谢谢你的帮助
答案 0 :(得分:2)
行。
我猜你只是没有正确逃脱。 还可以使用组来正确捕获您的内容。
<td>(.*)<\/td>
应该这样做。您可以在给定文本here上试用此正则表达式。如果您匹配所有td,请不要忘记全局标志。 (PHP中的preg_match_all)
通常使用正则表达式解析HTML并不是一个好主意,请尝试使用DOM解析器。 示例 - &gt; http://simplehtmldom.sourceforge.net/
使用
测试上述正则表达式$web = file_get_contents('http://www.w3schools.com/html/html_tables.asp' );
preg_match_all("/<td>(.*)<\/td>/", $web , $matches);
print_r( $matches);
答案 1 :(得分:1)
懒惰量词,不同分隔符
您需要.*?
而不是.*
,否则您可以超越结束</td>
。此外,/
分隔符出现在</td>
时需要进行转义。我们可以用另一个不需要转义的替换它。
这样做:
$regex = '~<td>.*?</td>~';
preg_match_all($regex, $web, $matches);
print_r($matches[0]);
<强>解释强>
~
只是一种美学调整 - 你可以在你的正则表达式模式周围使用你喜欢的任何分隔符,一般~
比/
更通用,需要转义更常见的是,例如在</td>
。.*?
中的星形量词由?
变为“懒惰”,因此点只匹配所需的字符数以允许下一个标记匹配(最短匹配)。如果没有?
,则.*
首先匹配整个字符串,然后仅根据需要进行回溯以允许下一个标记匹配(最长匹配)。