正则表达式
与Perl语言兼容的正则表达式处理函数
函数名 | 功能描述 |
---|---|
preg_match() | 进行正则表达式匹配 |
preg_match_all() | 进行全局正则表达式匹配 |
preg_replace() | 执行正则表达式的搜索和替换 |
preg_split() | 用正则表达式分割字符串 |
preg_grep() | 返回与模式匹配的数组单元 |
preg_replace_callback() | 用回调函数执行正则表达式的搜索和替换 |
正则表达式的语法规则
正则表达式匹配的模板,由原子(a~z),特殊功能的字符(*,+,?),模式修正符。
一个最简单的正则表达式模板中,至少包含一个原子"/a/",模式必须包含在两个反斜线"/"之间。
//在第二个字符串参数中,搜索与第一个参数给出的正则表达式匹配的内容 <?php $pattern='/<a.*?(?: |\\t|\\r|\\n)?href=[\'"]?(.+?)[\'"]?(?:|\\t|\\r|\\n)+.*?)?>(.+?)<Va.*?>/sim'; $content="请单击进入<a href='http://www.baidu.com'>PHP</a>笔记"; if(preg_match($pattern,$content)){ echo"匹配成功"; }else{ echo "未成功" }
定界符
正则表达式在定界符中间,除了字母数字反斜杠之外任何字符都可以作为定界符
/<\/\w+>/ 斜杠 |(\d{3})-\d+|Sm 竖线 !表达式! 感叹 {表达式} 花括号
原子
普通字符作为原子
包括大写和小写字母字符,所有数字
'/5/' 用于匹配是否有五个字符出现
'/php/' 用于匹配是否有PHP字符串出现
一些特殊字符和元字符作为原子
特殊字符作为原子需要使用转义字符"\"取消它的特殊意义
'/\./' 同于匹配字符串中是否有英文"."出现
'/<br\/\>/' 用于匹配字符串中是否有HTML的<br/>标记字符串出现
一些非打印字符作为原子
非打印字符为格式控制符号,例如空格,回车,制表符号等
原子字符 | 含义描述 |
---|---|
\cx | 匹配由x指明的控制字符。如\cM匹配一个Control-M或回车符,x为A~Z或a~z |
\f | 匹配一个换页符等价于\x0c和\cL |
\n | 匹配一个换行符等价于\x0a和\cJ |
\r | 匹配一个回车符等价于\x0d和\cM |
\t | 匹配一个制表符,等价于\x09和\cI |
\v | 匹配一个垂直制表符,等价于\x0b和\cK |
'/\r\n/' 匹配是否有回车换行符
使用通用字符类型作为原子
一个原子匹配一类字符
原子字符 | 含义描述 |
---|---|
\d | 匹配任意一个十进制数 |
\D | 匹配任意一个除十进制数字以外的字符 |
\s | 匹配任意一个空白字符 |
\S | 匹配除空白字符以外的任何一个字符等价于【^\f\n\r\t\v】 |
\w | 匹配任意一个数字,字母,下画线 |
\W | 匹配除数字,字母,下画线以外的任意一个字符 |
'/^\w+@\w+(\.\w+){0,3}$/' E-mail的正则表达式
自定义原子表[]作为原子
'/[apj]sp/' 匹配asp,psp,jsp三种
'/[^apj]sp/' 匹配除这三个的-sp类型字符
'/0[xX][0-9a-fA-F]+/' 匹配一个简单的十六进制数
元字符
构建正则表达式时的特殊字符
元字符 | 含义描述 |
---|---|
* | 匹配0,1,n次其前的原子 |
+ | 匹配1次或多次其前的原子 |
? | 匹配0或1次其前的原子 |
. | 匹配除了换行符外的任意一个字符 |
| | 匹配两个或多个分支选择 |
{n} | 表示其前面原子恰好出现n次 |
{n,} | 表示其前面原子出现不少于n次 |
{n,m} | 表示其前面原子至少出现n次最多出现m次 |
^或\A | 匹配输入字符串的开始位置(或在多行模式下的行的开头,即紧随一换行符后) |
$或\Z | 匹配输入字符串的结束位置(或在多行模式下,行的结尾紧随一换行符之前) |
\b | 匹配单词的边界 |
\B | 匹配除单词边界以外的部分 |
[] | 匹配方括号中指定的任意一个原子 |
[^] | 匹配除方括号中原子以外的任意一个字符 |
() | 匹配其整体的一个原子 |
向后引用
'/(Windows)(Linux)\\2OS/' 使用\2再次引用第二缓冲区中字符串“Linux”
'/(?:Windows)(Linux)\\1OS/' 使用"非捕获字符?=,?!,?:"忽略了第一个表达式的存储,所以"\1"引用的是“Linux”
优先级
优先级 | 元字符 | 描述 |
---|---|---|
1 | \ | 转义字符 |
2 | (),(?:),(?=),[] | 模式单元和原子表 |
3 | *,+,?,{n},{n,},{n,m} | 重复匹配 |
4 | ^,$,\b,\B,\A,\Z | 边界限制 |
5 | | | 模式选择 |
模式修正符
在正则表达式定界符之外使用
模式修正符 | 功能描述 |
---|---|
i | 在和模式进行匹配时不区分大小写 |
m | 将字符串视为多行 |
s | 设定此修正符,则"."匹配所有的字符,包括换行符,将字符串视为单行 |
x | 模式中空白忽略不计,除非被转义 |
e | 用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,并将其作为PHP代码求值。并用其结果来替换所搜索的字符串 |
U | 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上"?"才变得重复/a.*?e/。/a.*e/U |
D | 模式中的美元元字符仅匹配目标字符串的结尾,如果最后一个字符是换行符,则美元符号也会匹配此字符之前的内容,如果设定了m修正符则忽略此选项 |
与Perl兼容的正则表达式函数
字符串的匹配和查找
函数preg_match()
pre_match(正则表达式,字符串,输出的字符串)
preg_match($pattern,$subject,$matches)返回0,1
其中$matchrs[0]保存全部匹配结果。
其余1,2,3,4,5,,保存第一个小括号的内容,第二个小括号的内容...等
函数preg_match_all()
与preg_match类似,不同的是函数preg_match第一次匹配后会停止搜索,而preg_match_all会一直搜索到指定字符串的结尾。
preg_match_all(表达式,字符串,匹配结果,预定义值)
预定义值为PREG_PATTERN_ORDER是默认值,$matches(0)为全部模式匹配数组,$matches[1]为第一个括号中子模式所匹配的字符串组成的数组。
PREG_SET_ORDER对结果排序使$matches[0]为第一组匹配项的数组,$matches[1]为第二组匹配项的数组
该函数把所有可能的匹配结果放入第三个数组中,并返回整个模式匹配的次数
函数preg_grep()
匹配数组中的元素,返回与正则表达式匹配的数组单元
array preg_grep(正则表达式,字符串)
字符串处理函数strstr(),strpos(),strrpos()和substr()
查找一个字符串是否包含某个子字符串使用strstr()(返回从匹配的第一次字符串出现的点后的其余部分,未搜索到则返回false)或strpos()函数(返回字符串在另一个字符串中第一次出现的位置,没找到则返回false,对大小写敏感,如果要对大小写不敏感则可以使用stripos())。strrpos()(返回最后一次出现的位置,大小写不敏感则用strripos()),从一个字符串取出一段字符串使用substr()函数
<?php function getfilename($url){ $location=strrpos($url,"/")+1;//获取字符串最后一个"/"出现的位置,加一则代表文件开始位置 $fileName=substr($url,$location);//获取从$location位置取到结尾的子字符串 return $fileName;//获取返回的文件名 } echo getFileName("http://baidu.com/index.php");//获取网页文件名index.php
字符串的替换
函数preg_replace()
执行正则表达式的搜索和替换
preg_replace(匹配项正则表达式,替换项,被匹配项,匹配次数)
<?php $pattern="/(\d{2})\/(\d{2})\/(\d{4})/"; echo preg_replace($pattern,"\\3-\\1-\\2",$text); echo preg_replace($pattern,"\${3}-\${1}-\${2}",$text);//将“\\1”改为“\${1}”的形式替换第n个被捕获的括号内子模块所匹配的文本
模块修饰符“e”,设定了该字符,将把替换项的数值当成PHP代码求值 $pattern="/(<\/?)(\w+)([^>]*>)/e"; echo preg_replace($pattern,"'\\1'.strtoupper('\\2').'\\3'".$text);
函数str_replace()
str_replace(目标对象,替换对象,被处理字符串,变量名称(保存替换的次数))
不区分大小写则用str_ireplace()
字符串的分割和连接
函数preg_split()
按正则表达式的方法分割字符串,返回一个字符串数组
preg_split(分割的正则表达式,待分割的字符串,限制,标记)
限制意味着最多返回limit个字符串,为-1则没有限制。
标记为PREG_SPLIT_NO_EMPTY:只返回非空白部分。
PREG_SPLIT_DELIM_CAPTURE:定界符模式中的括号表达式也会被捕获并返回
PREG_SPLIT_OFFSET_CAPTURE:对每个出现的匹配结果返回其附属的字符串偏移量
函数explode()
用于字符串的分割
explode(分割字符串,被分割字符串,指定分割为多少个子串)
找不到分割则返回包含被分割字串的单个元素的数组
函数implode()
implode(连接字符或字符串,被连接的数组)
将数组中的每个元素用指定的字符连接起来