【问题标题】:preg_match_all print *all* matchespreg_match_all 打印 *all* 匹配
【发布时间】:2009-10-20 22:39:14
【问题描述】:

我需要使用 preg_match_all 打印所有匹配项。

$search = preg_match_all($pattern, $string, $matches);

foreach ($matches as $match) {
    echo $match[0];
    echo $match[1];
    echo $match[...];
}

问题是我不知道我的字符串中有多少个匹配项,即使我知道并且如果是 1000 个,输入所有这些 $match[] 将是相当愚蠢的。

【问题讨论】:

    标签: php preg-match-all


    【解决方案1】:

    $match[0]$match[1] 等项目不是单独的匹配项,而是“捕获”。

    无论有多少匹配项,$matches 中的条目数是恒定的,因为它基于您正在搜索的内容,而不是结果。搜索模式中的每对捕获括号总是至少有一个条目,再加上一个。

    例如,如果你这样做:

    $matches = array();
    $search = preg_match_all("/\D+(\d+)/", "a1b12c123", $matches);
    print_r($matches);
    

    即使找到了三个匹配项,匹配项也只有两个项目。 $matches[0] 将是一个包含“a1”、“b12”和“c123”(每个项目的完整匹配项)的数组,$matches[1] 将仅包含每个项目的第一个捕获,即“1”、“12”和“123”。

    我认为你想要的更像是:

    foreach ($matches[1] as $match) {
        echo $match;
    }
    

    这将从每个匹配的字符串中打印出第一个捕获表达式。

    【讨论】:

      【解决方案2】:

      print_r($matches) 能给你想要的吗?

      【讨论】:

        【解决方案3】:

        你可以递归循环。此示例需要 SPL 和 PHP 5.1+,通过 RecursiveArrayIterator:

        foreach( new RecursiveArrayIterator( $matches ) as $match )
            print $match;
        

        【讨论】:

          猜你喜欢
          • 2011-10-01
          • 1970-01-01
          • 2017-04-25
          • 2013-07-06
          • 2011-12-28
          • 2015-03-14
          • 1970-01-01
          • 1970-01-01
          • 2020-06-05
          相关资源
          最近更新 更多