-
PHP正则表达式语法汇总
行定位符、单词定界符实例用法(正则表达式字符集1)
行定位符(^和$):行定位符就是用来描述字串的边界。"^"表示行的开始;"$"表示行的结尾。如:
^tm
这个表达式表示要匹配字串I的开始位置是行头,如:tm equal Tomorrow Moon就可以匹配,而Tomorrow Moon equal tm就不可以匹配
tm$
则后者可以匹配而前者不可以。如果想要匹配的字串可以出现在字符串的任意部分,那么可以直接写成:
tm
单词定界符(\b、\B):
使用tm可以匹配在字符串中出现的任何位置。那么类似html,utmost中的tm也会被查找出来。但现在需要匹配的是单词tm,而不是单词的一部分。这时可以使用单词定界符\b,表示要查找的字串为一个完整的单词,如:
\btm\b
还有一个大写的\B,意思和\b相反。它匹配的字串不能是一个完整的单词,而是其他单词或字串的一部分。如:
\Btm\B
非打印字符、特殊字符、限定符实例用法
非打印字符
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
特殊字符
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(’ 则匹配 “(”。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
限定符
有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
正则表达式字符簇
[a-z] //匹配所有的小写字母
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符
PHP的正规表达式有一些内置的通用字符簇,列表如下:
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
子表达式、子表达式计数、分支用法浅析
子表达式
例如:
(very) *large
可以匹配"large","very large","very very large"等。
子表达式计数
例如:
(very){1,3}
表示匹配“very”,“very very”和“very very very”。
分支
例如,如果要匹配com、edu、或net,就可以使用如下所示的表达式:
com|edu|net
与Perl兼容的正则表达式函数
字符串的匹配与查找
preg_match()函数和preg_match_all()函数
<?php $str = 'cyy is cute.'; $preg = '/\b\w{2}/'; $num1 = preg_match($preg,$str,$str1); echo $num1.'<br>'; var_dump($str1); $num2 = preg_match_all($preg,$str,$str2); echo $num2.'<br>'; var_dump($str2);
匹配结果如下:
preg_quote()函数
函数功能:该函数讲字符串str中的所有特殊字符进行自动转义。如果有参数delimiter,那么该参数
所包含的字串也将被转义。函数返回转义后的字串。
<?php $str = '!、$、^、*、+、.、[、]、\\、/、cyy、<、>'; $str2 = 'cyy'; $res = preg_quote($str,$str2); echo $res.'<br>';
函数preg_grep()
<?php $preg = '/^\d{3,4}-\d{7,8}$/'; $arr = array('043212345678','0431-7654321','12345678'); $res = preg_grep($preg,$arr); var_dump($res);
在数组$arr中匹配具有正确格式的电话号(010-1234****等),并保存到另一个数组中。
字符串处理函数strstr()、strpos()、strrpos()、substr()
如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数,如果只是简单地从一个字符串中取出一段子字符串,建议使用substr()函数。虽然PHP提供的字符串处理函数不能完成复杂的字符串匹配,但处理一些简单的字符串匹配,执行效率则要比使用正则表达式稍高一些。
函数strstr()搜索一个字符串在另一个字符串中的第一次的出现,该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回FALSE。该函数对大小写敏感,如需进行大小写不敏感的搜索,可以使用stristr()函数。该函数有两个参数,第一个参数提供被搜索的字符串,第二个参数为所搜索的字符串,如果该参数是数字,则搜索匹配数字ASCII值的字符。该函数的使用代码如下所示:
<?php echo strstr('cyy is cute.','cyy').'<br>'; echo strstr('cyy is cute.',chr(115));
php用正则表达式匹配中文
gbk编码下汉字正则
1.判断字符串是否全是汉字
<?php $str1 = '全部是中文'; if (preg_match_all("/^([x81-xfe][x40-xfe])+$/", $str1, $match)) { echo '全部是中文'; }else{ echo '不全是中文'; } echo '<br>'; $str2 = '全部是中文~'; if (preg_match_all("/^([x81-xfe][x40-xfe])+$/", $str2, $match)) { echo '全部是中文'; }else{ echo '不全是中文'; }
2.判断字符串是否包含汉字
$str1 = '含有中文'; if (preg_match("/^([x81-xfe][x40-xfe])+$/", $str1, $match)) { echo '含有中文'; }else{ echo '不含有中文'; } echo '<br>'; $str2 = '~~~'; if (preg_match("/^([x81-xfe][x40-xfe])+$/", $str2, $match)) { echo '全含有中文'; }else{ echo '不含有中文'; }
UTF编码下匹配全部是中文:
$str1 = '全部是中文'; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str1)) { echo '全部是中文'; }else{ echo '不全是中文'; } echo '<br>'; $str2 = '全部是中文~'; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str2)) { echo '全部是中文'; }else{ echo '不全是中文'; }
UTF编码下匹配含有中文:
$str1 = '全部是中文'; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str1)) { echo '含有中文'; }else{ echo '不含有中文'; } echo '<br>'; $str2 = '~'; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str2)) { echo '含有中文'; }else{ echo '不含有中文'; }