欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

字符串和正则表达式(8)

程序员文章站 2022-05-04 10:15:35
正则表达式 在PHP中有两套正则表达式函数库。 PCRE库(Perl Compatible Regular Expression),基于传统型NFA。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配 POSIX扩展库(Portable Operation System interfa ......

正则表达式

在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"