【问题标题】:How to write the reg express to get the following pattern in the php?如何编写reg express以在php中获得以下模式?
【发布时间】:2014-07-28 10:37:36
【问题描述】:

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

所以我是这样写的:

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

那个返回null,怎么解决这个问题?感谢您的帮助

【问题讨论】:

  • 有人告诉我永远不要使用正则表达式来解析 HTML。改用 DOM 解析器 :) 但是如果您仍然需要帮助,我可以为您编写该正则表达式:D
  • 当然,在这种情况下我需要使用 php 来解决问题,尽管我已经使用 jquery 解决了它
  • 尝试非贪婪方式&lt;td&gt;.*?&lt;\/td&gt;
  • 仔细查看您的代码中/ 的数量以及为什么这可能是一个问题。
  • 您需要开启dotall模式(?s)&lt;td&gt;.*?&lt;\/td&gt;

标签: php html regex preg-match


【解决方案1】:

好的。

我猜你只是没有正确地逃脱。 还可以使用组来正确捕获您的东西。

<td>(.*)<\/td>

应该这样做。您可以在给定文本here 上尝试此正则表达式。如果您匹配所有 td,请不要忘记 全局标志。 (preg_match_all 在 PHP 中)

通常使用正则表达式解析 HTML 不是一个好主意,请尝试使用 DOM 解析器。 示例 -> 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);

【讨论】:

    【解决方案2】:

    惰性量词,不同的分隔符

    你需要.*?而不是.*,否则你可能会超过关闭&lt;/td&gt;。此外,当您的/ 分隔符出现在&lt;/td&gt; 中时,需要对其进行转义。我们可以用另一个不需要转义的替换它。

    这样做:

    $regex = '~<td>.*?</td>~';
    preg_match_all($regex, $web, $matches);
    print_r($matches[0]);
    

    说明

    • ~ 只是一种美学上的调整——你可以在你的正则表达式周围使用任何你喜欢的分隔符,通常~/ 更通用,需要更频繁地转义,例如在&lt;/td&gt;
    • .*? 中的星形量词被? 设置为“惰性”,因此点仅匹配允许下一个标记匹配所需的字符数(最短匹配)。如果没有?.* 首先匹配整个字符串,然后只回溯到允许下一个令牌匹配(最长匹配)所需的距离。

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 1970-01-01
      • 2021-09-06
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多