字符串和正则表达式(8)
正则表达式
在PHP中有两套正则表达式函数库。
PCRE库(Perl Compatible Regular Expression),基于传统型NFA。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配
POSIX扩展库(Portable Operation System interface),基于POSIX NFA。POSIX扩展的正则表达式由POSIX 1003.2定义
一般而言,实现相同的功能,使用PCRE库的效率略占优势
- 中括号
[0-9]匹配任何从0到9的十进制数
[a-z]匹配任何小写从a到z的字符
[A-Z]匹配任何大小从A到Z的字符
[A-Za-z]匹配任何大写A到小写z的字符
$name = "256"; if(preg_match("([2-9])",$name)){//匹配包含2到9的字符串 echo "true"; }
- 量词
p+。匹配任何至少包含一个字符p的字符串
p*。匹配任何包含零个或多个字符p的字符串
p?。匹配任何包含零个或一个字符p的字符串
p{2}。匹配任何包含两个连续p的字符串
p{2,3}。匹配任何包含两个或三个连续p的字符串
p{2,}。匹配任何包含两个或以上p的字符串
p$。匹配任何以p结尾的字符串
^p。匹配任何以p开头的字符串
[^0-9]。匹配任何不包含0到9的十进制数
p.p。匹配任何包含p和p之间的字符串
^.{2}$。匹配任何只包含两个字符的字符串
<b>(.*)</b>。匹配任何被<b></b>包围的字符串
p(hp)*。匹配任何包含一个p,p后面是hp的字符串
$name = "pass"; if(preg_match("/p+/",$name)){//匹配至少包含一个p的字符串 echo "true"; }
- 预定义字符范围(字符类)
[:digit:]数字[0~9]
[:lower:]小写字母[a~z]
[:upper:]大写字母[A~Z]
[:alpha:]大小写字母[A~Za~z]
[:alnum:]大小写字母以及数字[A~Za~z0~9]
[:xdigit:]十六进制字符[A~Fa~f0~9]
[:graph:]33~126范围的可打印ASCII字符
[:cntrl:]控制字符,如制表符、退格符或反斜杠
[:space:]空白字符:空格、水平制表符、垂直制表符、换行、换页或换行
[:punct:]标点符号
$name = "1314"; if(preg_match("([[:digit:]])",$name)){//匹配数字 echo "true"; }
- 修饰符
i不区分大小写
g查找所有出现
m将字符串视为多行
s将字符串视为一行
x忽略正则表达式中的空格和注释
$name = "xiukang"; if(preg_match("/XIU/i",$name)){//添加i不区分大小写 echo "true"; }
- 元字符
\A 只匹配字符串开头
\b 匹配单词边界
\B 匹配除单词边界之外的任何字符
\d 匹配数字字符
\D 匹配非数字字符
\s 匹配空白字符
\S 匹配非空白字符
[] 包围一个字符类
() 包围一个字符分组或定义一个反引用
$ 匹配行尾
^ 匹配行首
. 匹配除换行之外的任何字符
\ 引出下一个元字符
\w 匹配任何只包含数字字母和下划线的字符串
\W 忽略下划线、数字和字母
$name = "xiukang"; if(preg_match("/g\$/",$name)){//匹配以g结尾的字符串 echo "true"; }
- PHP的正则表达式函数
·搜索模式
preg_match()函数
//如果匹配的字符串全部为小写字母则返回false $name = "xiukang"; if(preg_match("([^[:lower:]])",$name)){ echo "true"; }else { echo "false"; }
preg_match()函数的第三个参数的作用,将字符串划分成二维数组
$xiu = '/(www)(.)(baidu)(.)(com)/'; $kang = 'www.baidu.com'; preg_match_all($xiu,$kang,$match); echo $match[0][0];//www.baidu.com echo $match[1][0];//www echo $match[2][0];//. echo $match[3][0];//baidu echo $match[4][0];//. echo $match[5][0];//com
·搜索数组
preg_grep()函数
$xiu = '/[0-9]/';//匹配包含1到9的字符串 $kang = array('123','456','abc','13ab','789'); $arr = preg_grep($xiu,$kang); print_r($arr);//Array ( [0] => 123 [1] => 456 [3] => 13ab [4] => 789 )
preg_grep()函数的第三个参数
$xiu = '/[0-9]/';//匹配包含1到9的字符串 $kang = array('123','456','abc','ab','789'); $arr = preg_grep($xiu,$kang,true);//true表示返回正则表达式未匹配的元素 print_r($arr);//Array ( [2] => abc [3] => ab )
·替换匹配模式的所有字符串
preg_replace()函数
$name = "xiukang 1997"; //将匹配的字符串替换为2018 $kang= preg_replace("([0-9]+)","2018", $name); print $kang;//xiukang 2018
·匹配所有出现的模式
preg_match_all()函数
(。。。)
·界定特殊的正则表达式字符
preg_quote()函数
在特殊含义的字符前插入一个反斜杠
特殊字符:$ ^ * () + = {} [] | \\ : <>
$name = "$500"; echo preg_quote($name);//返回"\$500" echo $name;//返回"$500"
·创建定制的替换函数
preg_relpace_callback()函数
// 将文本中的年份增加一年
$name = "xiu kang 2018"; function setName($sear){ //通常: $sear[0]是完成的匹配,$sear[1]是第一个捕获子组的匹配,以此类推 return $sear[1].($sear[2]+1); } echo preg_replace_callback("|(\D)(\d{4})|","setName",$name);//输出"xiu kang 2019 "
·以不区分大小写的方式将字符串划分为不同元素
preg_split()函数
$xiu = "xiu++kang+++++sear"; $kang = preg_split("/\++/",$xiu); foreach($kang as $sear){ echo "$sear<br/>";//输出"xiu kang sear" }
其他的字符串函数
- 确定字符串长度
strlen()函数
$pass = "2435325"; if(strlen($pass)>10){ echo "成功"; }else { echo "密码长度必须大于十位数"; }
- 比较两个字符串
·不区分大小写比较两个字符串
strcasecmp()函数
strcasecmp()函数将两个字符串转换为二进制,然后相减(不区分大小写)
$email1 = "admin@xiu.com"; $email2 = "ADMIN@xiu.com"; echo strcasecmp($email1,$email2);//返回0
·区分大小写比较两个字符串
strcmp()函数
strcmp()函数将两个字符串转换为二进制,然后比较大小
$text1 = $text2 返回0
$text1 < $text2 返回-1
$text1 > $text2 返回1
$text1 = "修"; $text2 = "抗"; echo strcmp($text1,$text2);//返回-1
- 处理字符串大小写
非字母字符不受影响
·将字符串全部转换为小写
strtolower()函数
$text = "XIU"; echo strtolower($text);//返回"xiu"
·将字符串全部转换为大写
strtoupper()函数
$text = "xiu"; echo strtoupper($text);//返回"XIU"
·将字符串的首字母转换为大写
ucfirst()函数
$text = "xiu"; echo ucfirst($text);//返回"Xiu"
·将字符串的每个单词的首字母转换为大写
ucwords()函数
$text = "xiu kang"; echo ucwords($text);//返回"Xiu Kang"
正则表达式函数的代替函数
·根据预定义的字符对字符串进行语法分析
strtok()函数
$name = "www.baidu/com"; $tokens = "./";//设置两个定界符(. /) $tokName = strtok($name,$tokens); while($tokName){ echo "$tokName<br/>";//输出"www baidu com" $tokName = strtok($tokens);//在后期调用时,不在包含第一个参数 }
·获取字符串最后出现的位置
strrpos()函数
echo strrpos("H e l l o w","l");//返回6
·获取字符串的一部分
strstr()函数
$name = "xiukang@qq.com"; echo strstr($name,"@");//@qq.com
·替换字符串
str_replace()函数
str_ireplace()函数(不区分大小写)
$name = "xiukang@qq.com"; echo str_replace("@","*",$name);//xiukang*qq.com
·获取字符串中的指定字符
subste()函数
$name = "Hellow"; echo substr($name,1,-2);//ell
·获取字符串中指定字符出现的次数
$name = "Hellow"; echo substr_count($name,"l");//返回2
·将数组转换为字符串
implode()函数
$arr = array("xiu","kang","sear"); echo implode("|",$arr);//输出"xiu|kang|sear"
- 填充和替换字符串
·删除字符串开始的字符
ltrim()函数
echo ltrim("Hellow","H");//ellow
·删除字符串末尾的字符
rtrim()函数
echo rtrim("Hellow","w");//Hello
·删除字符串两端的字符
trim()函数
echo trim("Hellow","wH");//ello
填充字符串
str_pad()函数
echo str_pad("xiu",5,"*")."kang";//输出"xiu**kang"
上一篇: 虾塘“机器人”要升级量产啦