【问题标题】:preg_match_all to return push empty data to resulting array when no match foundpreg_match_all 在未找到匹配项时将空数据返回到结果数组
【发布时间】:2013-07-22 16:24:23
【问题描述】:

我试图在以下数据上使用 preg_match_all

$data = "    .........data
    <p class='need'>
    ...........data
    </p>
    <p class='need'>
    ...........data
    </p>
    <p class='need'></p>

    <p class='need'>
    ...........data
    </p>
    <p class='need'></p>
";

preg_match_all("/.*?<p class=\"need\">(.*?)<\/p>/si",$data, $tmp);

上面返回所有存在数据的结果,但我希望在 $tmp 中包含一个空数据,这样我就得到了所有 5 个结果,但没有找到任何数据,而不是得到 3 个结果...

感谢任何帮助:)

【问题讨论】:

  • 简单解决方案:停止在 HTML 上使用正则表达式。改用 DOM。然后就是一些 xpath 的简单问题:$found = $xpath-&gt;query("//p[@class='need']");
  • 我同意 Marc B 的观点,但我不明白您为什么会遇到问题,因为 $tmp[1] 包含一个具有 NULL 值的数组,其中没有找到数据。因此,鉴于每个键都存在这一事实,您可以遍历数组并测试 NULL 值。换句话说,您将获得 5 个结果。其中 2 个是空的。

标签: php regex preg-match preg-match-all


【解决方案1】:

如果正则表达式是正确的用户,您的正则表达式肯定会返回 5 个匹配项。

问题出在这个正则表达式中:

"/.*?<p class=\"need\">(.*?)<\/p>/si"

如果您仔细观察,您会尝试用双引号匹配 "need" 类,而在您的 HTML 代码中,您使用的是用单引号括起来的类,如下所示:'need'

这是您更正的正则表达式,它将返回 5 个匹配项,包括 2 个空匹配项。

preg_match_all("/<p class='need'>(.*?)<\/p>/si", $data, $tmp);

PS:这正是您应该避免使用正则表达式解析 HTML 并考虑使用 DOM 解析器的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多