preg_replace 函数执行一个正则表达式的搜索和替换。
函数参数说明
- $pattern: 要搜索的模式,可以是字符串或一个字符串数组。
- $replacement: 用于替换的字符串或字符串数组。
- $subject: 要搜索替换的目标字符串或字符串数组。
- $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
- $count: 可选,为替换执行的次数。
这里有一篇文章,关于replacement如何使用。
一个实例
这个实例是在fancybox标签构建的时候看到的,研究了好一阵才明白其中的原理。
function fancybox ($content){
global $post;
$pattern = "/<img(.*?)src=('|\")([^>]*).(bmp|gif|jpeg|jpg|png|swf)('|\")(.*?)\/>/i";
$replacement = '<a$1href=$2$3.$4$5 data-fancybox="kanochan-images"$6><img$1src=$2$3.$4$5$6></a>';
$content = preg_replace($pattern, $replacement, $content);
return $content;
}
原始文本
<img src="https://p.kksk.ltd/2022/09/02/202209022213304.png" alt="image-20220902221322442" />
替换后的文本
<a href="https://p.kksk.ltd/2022/09/02/202209022213304.png" data-fancybox="images" alt="image-20220902221322442" ><img src="https://p.kksk.ltd/2022/09/02/202209022213304.png" alt="image-20220902221322442" /></a>
参数解析
$1
-> (.?) --> .:匹配除了换行“\n”外的任何字符;:匹配前面的子表达式零次或多次;?:当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串 --> null$2
--> ('|\") --> 匹配单引号或双引号 --> "$3
-> ([^/>]*) --> 匹配除了“>”之外的任何字符,并进行零次或多次匹配 --> 结果是:https://p.kksk.ltd/2022/09/02/202209022213304$4
--> (bmp|gif|jpeg|jpg|png|swf) --> 匹配图片扩展名 --> png$5
--> ('|\") --> 匹配单引号或双引号 --> "$6
-> (.*?) --> 匹配信息同$1
--> null