PHP正则表达式语法汇总

扶醉桌前 提交于 2020-08-13 18:38:11

行定位符、单词定界符实例用法(正则表达式字符集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 '不含有中文';
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!