正则表达式的分组和反向引用

一、分组

所谓分组就是为了实现多个字符绑定在一起而加括号把这一组字符限定为一个整体。比如我们要表达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)*/', 'ababddd', $matches);

print_r($matches);

( ?:exp):匹配exp,不捕获匹配的文本,也不给此分组分配组号。(这个平时用到的比较多)

<?php

preg_match('/(?:ab)*/', 'ababddd', $matches);

print_r($matches);

(?=exp):匹配exp前面的位置

(?<=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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值