在php中提供了两套支持正则表达式的函数库,分别是PCRE兼容正则表达式函数和POSIX函数库,但是由于PCRE函数库在执行效率上优于POSIX函数库,而且POSIX函数库中的函数已经过时,因此大部分都使用PCRE函数库
在程序开发中,经常需要使用正则表达式对数组中的元素进行匹配,可以使用preg_grep()函数,其声明格式如下
array preg_grep (string $spattern , array $input)
$spattern用于表示正则表达式模式,$input用于表示被匹配的数组,该函数返回一个数组,其中包含参数$input数组中与给定参数$spattern 模式想匹配的单元,该函数对于输数组$input中的每一个元素只匹配一次
案例:匹配禁用一个单词组成的科目名
<?php
$subjects=array(
"English",
"Social Science",
"Math",
"Chemistry",
"Commercial Science",
"Politics"
);
// 匹配兼用一个单词组成的科目
$single=preg_grep("/^[a-zA-Z]*$/",$subjects);
echo "<pre>";
print_r($single);
echo "</pre>";
?>
运行结果
使用preg_grep()函数匹配字符串,其中/^[a-zA-Z]*$/表示匹配以字母开头,字母结尾的字符串,,参数$subjects表示要搜索的字符串,如果匹配成功则存放在变量中并进行输出。
在程序开发中,经常需要根据正则表达式的模式对指定的字符串进行搜索并匹配,这是可使用preg_match()函数,其声明格式如下:
int preg_match (string $pattern, string $subiect[, array $matches [, int $flags]])
在上述声明中,参数$pattern用于表示正则表达式模式,参数$subiect用于指定被搜索的字符串,参数$matches是可选的,用于存储匹配结果,参数$flags也是可选的,如果将该参数的设置为“PREC_OFFSET_CAPTURE”,那么preg_match()函数将在返回每个出现的匹配结果的同时也会返回该匹配结果在字符串中的位置
案例:使用preg_match()函数搜索字符串中3个连续字符
<?php
$str="firsrnumber123 secondumber456"; //定义字符串变量$str
preg_match('/(\d)(\d)(\d)/i',$str,$arr); //匹配字符串中有3个连续数字的
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
运行结果
preg_match()函数的参数“/(\d)(\d)(\d)/”表示匹配3个连续的数字,$str表示待匹配的字符创,$arr存放匹配结果的数组
$arr[0]中存放的是第一个匹配到的目标,即3个连续的数字“123",$arr[1]中存放的是匹配第1个表达式“(\d)”的结果,$arr[2]中存放的是匹配第2个表达式“(\d)”的结果,以此类推。
由于preg_match()函数会在第一个匹配成功之后就停止匹配,所以输出结果不会出现"456"
preg_match_all()函数功能与preg_match()函数类似,区别在于preg_match()函数在第一次匹配成功后就停止查找,而preg_match_all()函数函数会一直匹配到最后才停止,获取到所有的匹配结果。preg_match_all()函数声明格式如下:
int preg_match_all(string $pattern ,string $subject ,array $matches[, ingt $flags])
上述声明中,$pattern用于表示正则表达式模式,$subject表示被搜索的字符串,$matches是可选参数,用于存储匹配结果, $flags是可选参数,它的值有PREG_PATTERN_ORDER(默认排序方式)和PREG_SET_ORDER,数组$matches中的$matches[0]保存匹配的整体内容,其他元素保存的是正则表达式内子表达式相匹配的内容,PREG_SET_ORDER用于确定$matches[0]中存储第一组匹配的数组,$matches[1]元素中存储第二组匹配的数组,以此类推
案例:使用preg_match_all()函数匹配字符串
<?php
$str="firsrnumber123 secondumber456"; //定义字符串变量$str
preg_match_all('/(\d)(\d)(\d)/i',$str,$arr); //匹配字符串中有3个连续数字的
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
运行结果
$arr变成了二维数组,其中$arr[0]存放匹配到的所有结果
$arr[1]存放每个匹配到的结果中的第一个子表达式的结果;$arr[2]存放每个匹配到的结果中的第二个子表达式的结果,以此类推
用于preg_match_all()函数会一直匹配到最后才停止匹配,所以输出结果中可以看到“456”也被匹配到了
在程序凯总,如果想通过正则表达式完成字符串的搜索和替换,则可以使用preg_replace()函数与字符串处理函数str_replace()相比,preg_replace()的功能更加强大,preg_replace()函数声明格式如下:
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject[, int $limit=-1[, int $count]])
上述声明中,该函数会搜索$subject中匹配$pattern的部分,并将匹配的部分用$replacement进行替换,其中参数$pattern便是正则表达式要搜索的模式,参数$replacement指定字符串替换内容,$subject指定需要进行替换的目标字符串,参数$limit指定在目标字符串上需要进行替换的最大次数,默认为-1(无无限,表示所有的匹配项都会被替换),参数$count是可选的,用于返回替换的次数。
案例:使用preg_replace()函数将链接地址中的名称提取出来
<?php
$str='<a href="https://www.lingyublog.com">陵小宇博客</a>';
//用第二个子表达式匹配结果替换整个字符串
$string=preg_replace('/<a href="(.*?)">(.*?)<\\/a>/','$2',$str);
echo $string;
?>
运行结果
$2指的的是第二个子表达式匹配的结果,由于“<a href="(.*?)">”可以匹配“<a href="https://www.lingyublog.com">”,(.*?)可以匹配“陵小宇博客”,<\\/a>可以匹配“</a>”,因此程序将str替换成“陵小宇博客”
explode()函数可以将字符串按照指定的字符分割成字符串数组,但是,如果希望按照特定的规则对字符创进行分隔,那么使用explode()函数就会变得很麻烦。在PCRE函数库中提供了preg_split()函数,它可以完成复杂字符串分割操作,如,将邮箱字符串中出现的“@”和“.”字符串的地方同时进行分割。preg_split()函数的声明格式如下:
array preg_split(string $spattern, string $subject [, int $limit[, int $flags]])
在上述声明中, $spattern表示正则表达式模式,$subject表示被分割的字符串,参数$limit是可选的,和explode()函数作用是一样的,$flags也是可轩参数,它的值包括3个,具体如下:
·PREG_SPLIIT_NO_EMPTY:如果设定了本标记,则pre_split()只返回非空部分
·PREG_SPLIT_DELIM_CAPTURE:如果设定了本标记,定界符模式中的括号表达式也会被捕获并返回
·PERG_SPLIT_OFFSTE_CAPTURE:如果设定了本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意如果改变了返回数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在$subject中的偏移量
案例:使用preg_split()函数对字符串进行分割
<?php
$str="character1 character2,character3 character4 character5 character6";
//分隔字符为空格或者逗号
$character=preg_split('[\s|,]',$str);
echo "<pre>";
print_r($character);
echo "</pre>"
?>
运行结果
字符串$str被分割成一个字符串,它是按照空格和逗号进行分隔而成。
*声明:内容来源于网络收集和整理,版权归原著所有,如来源信息有误或侵犯权益,请联系站长作修改和删除处理。