如何编写reg express来获取php中的以下模式?

时间:2014-07-28 10:37:36

标签: php html regex preg-match

有一个网站,我想获得所有<td> (any content) </td>模式字符串

所以我这样写:

preg_match("/<td>.*</td>/", $web , $matches);
            die(var_dump($matches));

返回null,如何解决问题?谢谢你的帮助

2 个答案:

答案 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>
  • .*?中的星形量词由?变为“懒惰”,因此点只匹配所需的字符数以允许下一个标记匹配(最短匹配)。如果没有?,则.*首先匹配整个字符串,然后仅根据需要进行回溯以允许下一个标记匹配(最长匹配)。