1. 正则表达式
正则表达式是对字符串进行操作的一种逻辑公式,就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。
使用PCRE库函数进行正则匹配
2. 正则表达式的基本语法
- 由分隔符和元字符组成
3. 分隔符
- 分隔符可以是非数字、非反斜线、非空格的任意字符,经常使用的分隔符是正斜线(/),hash符号(#)、取反符号(~)
/foo bar/
#^[^0-9]$#
~php~
- 如果模式中包含分隔符,则分隔符需要用反斜杠(\)转义
/http:\/\//
- 如果模式中包含较多的分割字符,建议更换其他字符作为分隔符,也可以采用preg_quote进行转义
$p='/http://';
$p='/'.preg_quote($p,'/').'/';
echo $p; //输出/\/http\:\/\//
- 分隔符后面可以使用模式修饰符,模式修饰符包括:i、m、s、x等,如i可以忽略大小写匹配,m多文本模式,s单行文本模式,x忽略空白字符
$str="Http://www.imooc.com/";
if(preg_match('/http/i', $str))
{
echo '匹配成功';
}
4. 元字符与转义
- 正则表达式中具有特殊含义的字符称之为元字符
- 常用的元字符:
- \ 一般用于转义
- 行定位符: ^ 断言目标的开始位置(多行模式下是行首),$断言目标的结束位置(多行模式下是行尾)。如“de$”表示以de结尾的字符串
- 单词定界符\b。如\ban\b表示匹配单词an,不匹配an作为单词的一部分。\B与此相反
- 点号操作符(.)匹配除换行符外的任何字符
- 字符类定义,放在[ ]中
- 选择字符(|)表示或,如Aa|Bb表示匹配Aa或者Bb。|与[ ]的区别:|可以匹配任意长度的字符,[ ]如果要匹配多个字符要配合连接字符(-)一起使用,如[a-b]表示匹配a或者b
- 括号字符(),限定子组,改变限定符如 |、*、^的限定范围。如(my|your)baby匹配的是mybaby或者yourbaby
- 限定符用于限定每个字符串出现的次数。如D+表示一个或多个D
- 方括号[]内使用的元字符:\ 转义字符;^表示排除不符合的字符;- 标记字符范围。如[^1-5]表示该字符不是1-5之间的数字
- 指定预定义的字符集
5. 贪婪模式与懒惰模式
- 正则表达式中的每个元字符匹配一个字符,当使用+后就会变得贪婪,将匹配尽可能多的字符
- 当使用?时将匹配尽可能少的字符
- 如果确切的知道所匹配的字符长度,可以使用{}指定匹配字符数
$p1='/\d+\-\d+/';
$p2='/\d?\-\d?/';
$p3='/\d{2}\-\d{4}/';
$str="我的电话是010-123456789";
preg_match($p1, $str,$match);
echo $match[0];//010-123456789
preg_match($p2, $str,$match1);
echo $match1[0];//0-1
preg_match($p3, $str,$match2);
echo $match2[0];//01-1234
6. 使用正则表达式进行匹配
目的判断子字符串是否存在,字符串替换、分割字符串、获取模式子串等。
PHP使用PCRE库函数进行正则匹配,通过设定好模式,然后调用相关的处理函数来取得匹配结果。
- preg_match($pattern,$subject,$match)返回值是匹配成功的次数0或者1(匹配成功一次后立即停止搜索),$match[0]包含完整模式匹配到的文本,$match[1]包含第一个匹配子组匹配到的文本,以此类推。
- preg_match_all获取所有匹配结果
7. 正则表达式的搜索和替换
- preg_replace($pattern,$replacement,$string)
$string='April 15, 2014';
$pattern='/(\w+) (\d+), (\d+)/i';
$replacement='$3,${1} $2';
echo preg_replace($pattern, $replacement, $string);