字符 | 描述 | 示例 |
(pattern) | 匹配pattern并捕获结果,自动设置组号。 | (abc)+d 匹配abcd或者abcabcd |
(?<name>pattern) 或 (?"name"pattern) | 匹配pattern并捕获结果,设置name为组名。 | |
num | 对捕获组的反向引用。其中 num 是一个正整数。 | (w)(w)21 匹配abba |
k< name > 或 k" name " | 对命名捕获组的反向引用。其中 name 是捕获组名。 | (?<group>w)abck<group> 匹配xabcx |
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )前面两项是我们常用的,$pattern是正则匹配模式,$string是要匹配的字符串。
$mode = "/a=(d+)b=(d+)c=(d+)/";$str="**a=4b=98c=56**";$res=preg_match($mode,$str,$match);var_dump($match);结果如下:

按图中的匹配模式匹配时,捕获组的123号分别是红绿蓝。
捕获组的忽略与命名
我们还可以阻止PHP为匹配组的编号:在匹配组中模式前加 ?:
$mode = "/a=(d+)b=(?:d+)c=(d+)/";这样,匹配结果就会变成:
array (size=3) 0 => string "a=4b=98c=56" (length=11) 1 => string "4" (length=1) 2 => string "56" (length=2)当然,我们也可以在括号的内部为它给它独特的名字。
array (size=5) 0 => string "a=4b=98c=56" (length=11) 1 => string "4" (length=1) "sec" => string "98" (length=2) 2 => string "98" (length=2) 3 => string "56" (length=2)在保留索引数组的同时,加上一个关联项,key值为捕获组名。
$mode = "/a=(d+)b=(d+)c=(d+)/";$str="**a=4b=98c=56**";$rp="1/$2/3/";echo preg_replace($mode,$rp,$str);//**4/98/56/**1表示捕获组1(4),$2为捕获组2(98),3为捕获组3(56)。
字符 | 描述 | 示例 |
(?:pattern) | 匹配pattern,但不捕获匹配结果。 | "industr(?:y|ies) 匹配"industry"或"industries"。 |
(?=pattern) | 零宽度正向预查,不捕获匹配结果。 | "Windows (?=95|98|NT|2000)" 匹配 "Windows2000" 中的 "Windows" 不匹配 "Windows3.1" 中的 "Windows"。 |
(?!pattern) | 零宽度负向预查,不捕获匹配结果。 | "Windows (?!95|98|NT|2000)" 匹配 "Windows3.1" 中的 "Windows" 不匹配 "Windows2000" 中的 "Windows"。 |
(?<=pattern) | 零宽度正向回查,不捕获匹配结果。 | "2000 (?<=Office|Word|Excel)" 匹配 " Office2000" 中的 "2000" 不匹配 "Windows2000" 中的 "2000"。 |
(?<!pattern) | 零宽度负向回查,不捕获匹配结果。 | "2000 (?<!Office|Word|Excel)" 匹配 " Windows2000" 中的 "2000" 不匹配 " Office2000" 中的 "2000"。 |
$pattern="/d(?=abc)/";$str="ab36abc8eg";$res=preg_match($pattern,$str,$match);var_dump($match);//6匹配的6,因为只有它作为一个数字,后面还有abc。
$pattern="/(?<=abc)d/";$str="ab36abc8eg";$res=preg_match($pattern,$str,$match);var_dump($match);//8匹配的8,因为只有它作为一个数字,后面还有abc。