【PHP基础】preg_replace的各种用法吐槽解析大全

那年仲夏 提交于 2020-04-23 10:42:03
<?php

$string='Abbb 12,2003';
$pattern='/(\w+) (\d+),(\d+)/i';
$replacement='${1}1,$1';
echo preg_replace($pattern,$replacement,$string).'<br>';
//输出 Abbb1,Abbb,如果把$replacement改为${1}1,$3的话,则输出Abbb1,2003
//如果把$replacement改成${1}333$1的话,则输出Abbb333,Abbb
//通过比较,可以体会到${1}和$1以及纯数字之间的关系。
?>

<?php
$string='The quick brown fox jumped over the lazy dog.';
$patterns=array();
$patterns[0]='/quick/';
$patterns[1]='/brown/';
$patterns[2]='/fox/';
$replacements=array();
$replacements[2]='bear';
$replacements[1]='black';
$replacements[0]='slow';
echo preg_replace($patterns,$replacements,$string).'<br>';
//输出:The bear black slow jumped over the lazy dog. 大家注意看到我所设置的$replacements[]
//数组的下标了吧?我是随意设置的,但是还是按照了“匹配模式的出现顺序来匹配的”,个人觉得这个顺序
//很傻啊,怎么会有这种顺序的,数组下标的存在意义完全没有了!所以可以利用另外一种改进方式。
?>

<?php
$string='The quick brown fox jumped over the lazy dog.';
$patterns=array();
$patterns[0]='/quick/';
$patterns[1]='/brown/';
$patterns[2]='/fox/';
$replacements=array();
$replacements[2]='bear';
$replacements[1]='black';
$replacements[0]='slow';
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns,$replacements,$string);
//唯一值得一提的就是ksort的作用就是把数组按照键名进行排序,所以...就可以不用在乎他们的出现次序了~!
?>
<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
                   '/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
/*啊,这个一开始真的有些难理解啊,不过认真读读,也弄懂了,先说明一下,这个程序
 *的输出是:$startDate = 5/27/1999
 * 至于为什么会输出这个,有几个地方要解释的
 * 1.在$patterns中的数组中模式的顺序,并不会影响到真正输出值的顺序,只是代表种类而已,比如
 * 这个例子中,数组中的第一个模式是数字的匹配,第二个模式是字符串{括号中的值}的匹配,但是真正输出
 * 的值的顺序却是{括号中的值}+数字,这样大家就明白了,这个顺序并没什么影响的;
 * 2.\s代表空格的意思,而\s*代表任意多个空格,我觉得在第二个模式中这样写,也是为了让匹配进行地更加顺利吧,如果你
 * 不写\s*也行,但是你的字符串,就一定要是'{startDate}=1999-5-27'而不能是'     {startDate}=1999-5-27'或者'{startDate}    =1999-5-27'
 * 3.最难的地方,就是对\3/\4/\1\2的理解了,其实只要认识到/是转义字符就好,而如果\在字符串的中间部分出现的话,那必须要用/来转义,若\在开头
 * 出现,则可以不用转义;好,现在来说说\3,\4,\2,\1分别是什么意思,\3对应的是$patterns数组中的第三个括号内的内容,即(\d{1,2}),而\4就是对应
 * 第四个括号内的内容,也就是(\d{1,2}),那\2,\1还用我解释么?哈哈,所以'\3/\4/\1\2'的大概意思就是,把三四项提前,一二项推后而已啦~!
 * 4.最后还有一个小陷阱,大家在正则中看到$符号,就会以为它一定会有什么特殊意义,比如'$\1 ='中的$就让我迟疑了一下,其实这里的美元符,就是
 * 让我们照常输出而已,如果把'$\1 ='的美元符去掉,那输出的东西就是:startDate = 5/27/1999  好了,到现在这里,大家明白了吧~
 *
 *  */

?>

<?php
$str='foo    o';
$str=preg_replace('/\s+/',' ',$str);
echo $str.'<br>';
?>
<?php
$count=0;
echo preg_replace(array('/\d/','/\s/'),'*','xp 4 4 to',-1,$count).'<br>';
echo $count.'<br>';

/*
这个其实在语法上没什么转弯的难度,但是这个例子对理解preg_replace的参数,有十分强的作用;
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
preg_replace前三个参数就不用说了,重点是后两个,
limit 表示每个模式在每个subject上进行替换的最大次数. 默认是 -1(无限). 

count表示如果指定, 将会被填充为完成的替换次数.
在这个例子中,主要是想把字符串中的空格和数字替换成*号,然后-1上面解释过了,然后把替换的次数赋值到$count里面,
所以这个程序的输出是:
xp*****to
5


*/
?>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!