正则表达式
<?php
$a = "time to shop";
if(preg_match('/shop/', $a)){
echo "yes";
}
else{
echo "no";
}
?>
结果如图:
上面代码的意思是在$a
中匹配shop
字符串,如果匹配成功,则立刻停止匹配并输出yes,否则继续匹配,直到没有匹配项,便输出no。
其中的shop
就是正则表达式。
//
是分隔符,每个表达式必须包含在一对分隔符中。可以选择任何非字母、数字、“/”或空格来进行分隔,若要在匹配的字符串中加入“/”,则要用“\”进行转义。例如:/http:/\/\/
。
有时要在结束分隔符之后加上模式修饰符,如:/shop/i
,该模式下将不区分大小写匹配“shop”。
可以用"."匹配除换行符以外的任何字符的通配符。如:/.at/
可匹配“cat”、“mat”、“sat”、“#at”等字符串。通常情况下该匹配符用于匹配操作系统的文件名。
也可用/[a-z]at/
来匹配,/[a-z]at/
的意思是以小写字母a到小写字母z开头的后面为at的字符串,即:“aat”、“bat”、“cat”……一直到“zat”都能匹配。“-”表示一个范围。
当表达式变成[^a-z]
,用来匹配任何不在a和z之间的字符。
预定义类
[[:alnum:]]
用来匹配文字(英文字母、单词)数字字符。
[[:alpha:]]
用来匹配字母。
[[:asci:]]
匹配ACSII字符。
[[:space:]]
匹配空白字符。
[[:lower:]]
匹配小写字母。
[[:upper:]]
匹配大写字母。
[[:digit:]]
匹配小数。
[[:xdigit:]]
匹配十六进制数字。
等等。
注意,外部方括号是分隔字符类,而内部方括号是字符类名称的一部分,如:
<?php
$a = '1234';
if(preg_match('/[[:alpha:]1-5]/',$a))
{echo 'yes';}
else
{echo 'no';}
?>
结果为yes。当$a=abc
时,也输出yes。其中正则表达式的意思为匹配字母或1到5的数字。
重复
**“+”**可以表示这个模式可以出现1次或多次。
**“*”**可以表示这个模式可以出现0次或多次。
**“?”**可以表示这个模式可以出现0次或1次。
如:[[:alpha:]]+
表示“至少有一个字母字符”。
子表达式
用圆括号表示至少这些字符串的一个需要匹配该模式。如:
/(very)*large/
可以匹配"large"、“very large”、“very very large”。意思是匹配0次或多次出现very且必有large。
子表达式计数
用花括号中使用数字表达式指定内容允许重复的次数或可重复次数的范围。如:
/(very){2,3}/
可以匹配“very very”、“very very very”、“very very very”。
定位到字符串开头或末尾
脱字符号^
用于正则表达式的开始,如/^bob/
用来匹配字符开始处匹配bob。
注意,要和上面字符不属于某个集合的用法区分开
$
字符用于正则表达式末尾,表示一定要出现在末尾。/com$/
即匹配以com结尾的字符串。
分支
可以用|
来进行模式选择,如/com|edu|net/
即匹配以com、edu或net结尾的字符串。
匹配特殊字符
若要匹配".","{","$"
等特殊字符,需要在它前面加上转义字符"\"
以转义。若要匹配"\"
,则需要\\
来表示。
注意,正则表达式一般是用单引号来引用正则表达式模式,因为用双引号会造成很多不必要的麻烦,如下:
<?php
$a = "$";
if(preg_match("/\\\$/",$a))
{echo 'yes';}
else
{echo 'no';}
?>
结果如图:
在这里,用双引号时,PHP解释器将“\\\$”
解释为\$
,然后正则表达式解释器将其解释为$
。