PHP preg_match_all PCRE 正则函数



  • 定义和用法

    preg_match_all - 执行一个全局正则表达式匹配
  • 版本支持

    PHP4 PHP5 PHP7
    支持 支持 支持
    5.4.0 参数matches成为可选的。
    5.3.6 如果 offset 大于 subject 的程度,将返回 FALSE。
    5.2.2 子命名分组语法可以接受(?<name>),(?'name')以及 (?P<name>)了。 之前版本仅接受(?P<name>)方式。
  • 语法

    preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
    
    搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中. 在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索.
  • 参数

    参数 必需的 描述
    pattern 要搜索的模式,字符串形式。
    subject 输入字符串。
    matches 多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。
    flags 可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):
    • PREG_PATTERN_ORDER - 结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。
    • PREG_SET_ORDER - 结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组), $matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。
    • PREG_OFFSET_CAPTURE - 如果这个标记被传递,每个发现的匹配返回时会增加它相对目标字符串的偏移量。 注意这会改变matches中的每一个匹配结果字符串元素,使其 成为一个第0个元素为匹配结果字符串,第1个元素为 匹配结果字符串在subject中的偏移量。
    如果没有给定排序标记,假定设置为PREG_PATTERN_ORDER。
    offset 通常, 查找时从目标字符串的开始位置开始。可选参数offset用于 从目标字符串中指定位置开始搜索(单位是字节)。
    注意:使用 offset 参数不同于传递 substr($subject, $offset) 的 结果到 preg_match_all() 作为目标字符串,因为 pattern 可以包含断言比如^, $ 或者 (?<=x) 。 示例查看 preg_match()。
  • 返回值

    返回完整匹配次数(可能是0),或者如果发生错误返回FALSE。
  • 示例

    //\\2是一个后向引用的示例. 这会告诉pcre它必须匹配正则表达式中第二个圆括号(这里是([\w]+))
    //匹配到的结果. 这里使用两个反斜线是因为这里使用了双引号.
    $html = "<b>bold text</b><a href=howdy.html>click me</a>";
    
    preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);
    
    foreach ($matches as $val) {
        echo "matched: " . $val[0] . "\n";
        echo "part 1: " . $val[1] . "\n";
        echo "part 2: " . $val[2] . "\n";
        echo "part 3: " . $val[3] . "\n";
        echo "part 4: " . $val[4] . "\n\n";
    }
    
  • 相关函数

    preg_quote() - 转义正则表达式字符
    preg_match() - 执行匹配正则表达式
    preg_replace() - 执行一个正则表达式的搜索和替换
    preg_split() - 通过一个正则表达式分隔字符串
    preg_last_error() - 返回最后一个PCRE正则执行产生的错误代码