php函数preg_match_all如何输出匹配数组

时间:2015-05-12 08:44:14

标签: php

<?php
// The \\2 is an example of backreferencing. This tells pcre that
// it must match the second set of parentheses in the regular expression
// itself, which would be the ([\w]+) in this case. The extra backslash is
// required because the string is in double quotes.
$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";
}
?>

在这个例子中,它首先使用模式找到匹配并将它们放在matches数组中。但我无法理解它是如何找到零件的(val [0],val [1],......)(基本上不知道什么是零件)

2 个答案:

答案 0 :(得分:2)

非常简单:索引0保存匹配的整个字符串,从1到N,您拥有您定义的各种捕获组。

因此,给定正则表达式/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/,第1组将包含整个开始标记,第2组将包含特定标记名称,第3组包含标记内容,第4组将包含结束标记。

例如:

$html = "<b>bold text</b>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

// here we have
// $matches[0] == "<b>bold text</b>";
// $matches[1] == "<b>";
// $matches[2] == "b";
// $matches[3] == "bold text";
// $matches[4] == "</b>";

与往常一样,另请参阅the docs

  

如果提供了匹配,那么它将填充搜索结果。   $matches[0]将包含与完整模式匹配的文本,   $matches[1]将获得与第一个捕获的文本匹配的文本   带括号的子模式,依此类推。

答案 1 :(得分:0)

$val[0]是与整个regex匹配的字符串的一部分。从14的部分是与regex中的捕获组匹配的子字符串。捕获组由括号(())分隔,并且它们的左括号从左到右计数。

/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/
 ^ ^             ^    ^
 1 2             3    4

我在每组的左括号上面标记。小组是:

1: (<([\w]+)[^>]*>)
2: ([\w]+)
3: (.*?)
4: (<\/\\2>)

如您所见,组#2嵌入在组#1中,这意味着$val[2]将是$val[1]strpos($val[1], $val[2]) !== FALSE)的子字符串。此外,由于组#4包含对组#2的反向引用,因此$val[2]中返回的值将是$val[4]的子字符串。

有关如何构建regex的更多说明,请阅读有关PCRE Patterns的PHP文档。