您的位置:首页 > 编程语言 > PHP开发

PHP 正则表达式语法(二)

2012-04-04 20:52 387 查看


重复

正则表达式的威力在于其能够在模式中包含选择和循环,正则表达式用一些重复规则来表达循环匹配。

常用的重复如下:
重复说明
*重复零次或更多次
+重复 1 次或更多次
?重复零次或 1 次
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次


分枝

分枝是指制定几个规则,如果满足任意一种规则,则都当作匹配成功。具体来说就是用 | 符号把各种规则分开,且条件从左至右匹配。


提示

由于分枝规定,只要匹配成功,就不再对后面的条件加以匹配,所以如果你想匹配有包含关系的内容,请注意规则的顺序。

下面是一个使用分枝的例子。

美国的邮政编码的规则是 5 个数字或者 5 个数字连上 4 个数字,如 12345 或者 54321-1234 ,如果要匹配所有的邮编,则正确的正则表达式为:
\d{5}-\d{4}|\d{5}
//错误写法
\d{5}|\d{5}-\d{4}


下面的错误写法,只能匹配到 5 位数字及 9 位数字的前 5 位数字的情况,而不能匹配 9 位数字的邮编。


分组

在正则表达式中,可以用小括号将一些规则括起来当作分组,分组可以作为一个元字符来看待。

分组的例子,验证 IP 地址:
(\d{1,3}\.){3}\d{1,3}


这是一个简单的且不完善的匹配 IP 地址的正则表达式,因为它除了能匹配正确的 IP 地址外,还能匹配如 322.197.578.888 这种不存在的 IP 地址。

当然,用这个表达式简单匹配成功后可以在利用 PHP 的算术比较再加以判断 IP 地址是否正确。而正则表达式中没有提供算术比较功能,如果要完全匹配正确的 IP 地址,则需要改进如下:
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)


规则说明

该规则关键之处在于确定 IP 地址每一段范围为 0-255 ,然后再重复 4 次即可。在:
25[0-5]|2[0-4]\d|[01]?\d\d?


中,用分枝首先确定了 250-255 和 200-249 。 [01]?\d\d? 则确定了 0-199 的范围,综合起来就是 0-255 。


贪婪与懒惰

正则表达式默认的情况下,会在满足匹配条件下尽可能的匹配更多内容。如 a.*b,用他来匹配 aabab ,它会匹配整个 aabab ,而不会只匹配到 aab 为止,这就是贪婪匹配。

与贪婪匹配对应的是,在满足匹配条件的情况下尽可能的匹配更少的内容,这就是懒惰匹配。

上述例子对应的懒惰匹配规则为:
a.*?b


如果用该表达式去匹配 aabab ,那么就会得到 aab 和 ab 这样两个匹配结果。

常用的懒惰限定符如下:
懒惰限定符说明
*?重复任意次,但尽可能少重复
+?重复 1 次或更多次,但尽可能少重复
??重复 0 次或 1 次,但尽可能少重复
{n,}重复 n 次以上,但尽可能少重复
{n,m}重复 n 到 m 次,但尽可能少重复


模式修正符

模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明。

常用的模式修正符如下:
模式修正符说明
i模式中的字符将同时匹配大小写字母
m字符串视为多行
s将字符串视为单行,换行符作为普通字符
x将模式中的空白忽略
epreg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
A强制仅从目标字符串的开头开始匹配
D模式中的 $ 元字符仅匹配目标字符串的结尾
U匹配最近的字符串
u模式字符串被当成 UTF-8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: