一、分组
所谓分组就是为了实现多个字符绑定在一起而加括号把这一组字符限定为一个整体。比如我们要表达0个或者多个a那么可以直接a*而如果表达0ge或者多个ab那么就用括号把ab括起来(ab)*,这个时候ab就是一个分组。
分组常用的的语法有:
(exp):匹配exp,并且捕获文本到自动命名的组里。
这里这个自动命名要理解一下,就是一个正则表达式里如果有多个组,如果你没有给组添加自己的名字,那么正则表达式会自动给这几个组从左到右自动命名,从左到右依次是1到9。
如果你手动给组命名,那么正则表达式会从左到右扫描2遍,先扫描自动命名再扫描手动命名。
<?PHP
preg_match('/(ab)*/','ababddd',$matches);
print_r($matches);
(?<name>exp):匹配exp,并且捕获文本到name的组里,也可以写成(?'name'exp)
<?PHP
preg_match('/(?<name>ab)*/',$matches);
print_r($matches);
( ?:exp):匹配exp,不捕获匹配的文本,也不给此分组分配组号。(这个平时用到的比较多)<?PHP
preg_match('/(?:ab)*/',$matches);
print_r($matches);
(?=exp):匹配exp前面的位置
(?<=exp):匹配exp后面的位置
(?<!exp):匹配前面不是exp的位置
(?#comment):提供注释辅助阅读不会对正则表达式产生任何影响
二、反向引用
反向引用用于重复搜索前面某个分组匹配的文本。
实例:
<?PHP
preg_match('/\b(w+)\b\s+\1\b','hello hello',$matches);
print_r($matches);
这里的\1代表分组1匹配的文本。
再看一个复杂一点的例子,就是比如论坛里的表情替换。
<?PHP
$str = "[url]1bb.gif[/url][url]2_aa.gif[/url]"; $s = preg_replace('/\[url\](\w+\.gif)\[\/url\]/','<img src="http://www.ai.com/uploads/$1 />',$str); print_r($s); echo PHP_EOL;