元字符
注意:
1,当我们要匹配这些元字符的时候,我们需要用到字符转移字符,正则表达式里面用\来表示转义,如匹配.符号,则需要用\.
2,连续的数字或字母可以用-符号连接起来,如[1-5]匹配1-5这5个数字。
重复,限定符
分枝
分枝是指制定几个规则,如果满足任意一种规则,则都当作匹配成功。具体就是用|符号把各种规则分开,且条件从左至右匹配
由于分支规定,只要匹配成功,则不再对后面的条件加以匹配
例:
美国邮政编码的规则是5个数字或者5个数字连上4个数字,如12345-54321,如果要匹配所有邮编:
//正确写法
\d{5}-\d{4}|\d{5}
//错误写法
\d{5}|\d{5}-\d{4}
错误的写法,只能匹配5位数字即9位数字的前5位数字的情况,而不能匹配9位数字的邮编
分组
在正则表达式中,可以用小括号将一些规则括起来当作分组,分组可以做为一个元字符来看待
例:匹配IP地址
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
规则说明
25[0-5]|2[0-4]\d|[01]?\d\d?
分支首先确定了250-255和200-249。[01]?\d\d?则确定了0-199的范围,综合起来就是0-255
IP地址每一段范围0-255,然后重复4次既可
贪婪与懒惰
正则表达式默认情况下,会在满足条件下尽可能的匹配更多的内容
如a.*b,用来匹配aabab,它会匹配整个aabab,而不会只匹配到aab为止,这就是贪婪匹配
与贪婪匹配对应的是,在满足匹配条件的情况下尽可能匹配更少的内容,这就是懒惰匹配。
上述例子对应的懒惰匹配规则为:
a.*?b
如果用该表达式去匹配aabab,那么就会得到aab和ab这样两个匹配结果。
懒惰限定符
模式修正符
模式修正符在标记在整个正则表达式之外的,可以看作是对正则表达式的一些补充说明
int preg_match(string pattern, string subject [, array matches])
preg_match()函数用于进行正则表达式匹配,成功返回1,否则返回0
preg_match()第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需要使用preg_match_all()函数
例:
$str = 'PHP is the best script';
if(preg_match("/php/i",$str,$matches)){
var_dump($matches);//$matches=[0=>'PHP'];
}
使用了i修正符,因此不区分大小写去文本匹配php
例:
$str = "http://www.baidu.com/index.html";
preg_match("/^(http:\/\/)?([^\/]+)/i",$str,$matches);
var_dump($matches);
//$matches = [0=>'http://www.baidu.com',1=>'http://',2=>'www.baidu.com'];
$matches[0],包含整个匹配到的文本,$matches[1]匹配第一个括号(http:\/\/)匹配到的文本,$matches[2]匹配到的是第二个括号([^\/]+)匹配到文本即非/的文本
int preg_match_all(string pattern,string subject,array matches [ , int flags])
preg_match_all()函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为0),如果出错返回false
array preg_split(string pattern, string subject, [,int limit [, int flags]])
preg_split()函数用于正则表达式分割字符串,返回一个数组,包含subject匹配的边界所分割的字串
mixed preg_replace(mixed pattern,mixed replacement,mixed subject [,int limit])
例:
$str = "The quick brown fox jumped over the lazy dog.";
$str = preg_replace('/\s/','-',$str);
echo $str;//The-quick-brown-fox-jumped-over-the-lazy-dog.
例2:
使用数组
$str = "The quick brown fox jumped over the lazy dog.";
$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";
$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";
print preg_replace($patterns, $replacements, $str);
/*输出:
The bear black slow jumped over the lazy dog.
*/
ksort($replacements);
print preg_replace($patterns, $replacements, $str);
/*输出:
The slow black bear jumped over the lazy dog.
*/
PHP常用正则表达式
匹配Email地址\w+([-+.]\w+)*@\w+([-+.]\w+)*\.\w+([-.]\w+)*
匹配QQ号[1-9]\d{4,}
匹配日期2017-09-11,^\d{4}-\d{1,2}-\d{1,2}$
15位或18位身份证\d{14}(\d{4}|\d{3}[xX])|\d{1})
匹配ip地址((25[0-2]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-2]|2[0-4]\d|[01]?\d\d?)