一、需求
项目中iconv()函数使用时,一部分使用了“//IGNORE”配置,一部分没有使用,现在需要将项目中所有用到iconv()函数的位置都添加“//IGNORE”配置;
$cusTitle = iconv('utf-8','GBK',$cusInfo['system_custom_'.$this->lan_key].$title_suffix);
修改为:
$cusTitle = iconv('utf-8','GBK//IGNORE',$cusInfo['system_custom_'.$this->lan_key].$title_suffix);
二、需求实现
项目中涉及iconv()函数的页面太多,手动修改很明显不是一个明智的解决方法,可以在PhpStorm等编辑器中通过正则表达式批量查找替换;
*查找正则表达式:iconv\((['"][^'"]*['"])(,\s?)(['"])([^'"//]*)(['"])
*替换正则表达式:iconv\($1$2$3$4//IGNORE$5
*截图为在PhpStorm中根据正则表达式批量查找替换
三、知识能量站
1、反向引用:
*在一个正则表达式的部分模式两边添加圆括号,捕获到的相关匹配会存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储(详见实例2);
*将( 和 ) 之间的表达式定义为“组”(group),捕获到的相关匹配即为捕获组;
*缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。在同一个表达式中,每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
将( 和 ) 之间的表达式定义为“组”(group)
*可以使用非捕获元字符 ?:(详见实例2)、?= 或 ?! 来重写捕获,忽略对相关匹配的保存(详见实例2)。
2、实例1:PhpStorm 通过正则表达式批量查找替换(添加一部分内容)
1)实现内容:
*批量在iconv()函数中未使用“//IGNORE”的位置添加“//IGNORE”
$cusTitle = iconv('utf-8','GBK',$cusInfo['system_custom_'.$this->lan_key].$title_suffix);
2)、实现
*查找正则表达式:iconv\((['"][^'"]*['"])(,\s?)(['"])([^'"//]*)(['"])
*替换正则表达式:iconv\($1$2$3$4//IGNORE$5
*替换正则表达式中可以使用$n对应获取到查找正则表达式对应的圆括号模式中匹配到的内容
3)、解析
**iconv\(
匹配到 iconv(,因为(为特殊字符,匹配时(时,需要通过\转义;
**第一个括号 (['"][^'"]*['"])
匹配 ‘utf-8’
['"]
匹配单引号或者双引号,兼容了单双引号的书写;
[^'"]*
匹配utf-8,其中不匹配单或者双引号,避免使用*匹配一个或多个内容时,直接把‘GBK’也匹配到此括号中而达不到想要的效果,此括号预期只匹配’utf-8’,不可扩大匹配到‘utf-8’,’‘GBK’;
**(,\s?)
匹配,和空格,\s?
匹配一个空格,兼容写代码时,规范化书写空格的情况;
**(['"])([^'"//]*)(['"])
匹配‘GBK’,其中不匹配单或者双引号和//,不匹配单或者双引号,避免扩大匹配到'GBK',$cusInfo['system_custom_'
,不匹配//
,是避免把已有//IGNORE
的iconv匹配到,防止替换时在已有//IGNORE
后再添加//IGNORE
;
此模式为真正需要的内容,因为需要在第二个参数末尾添加//IGNORE
,匹配到第二个参数,替换时在第二个参数后面添加‘//IGNORE’即可。
3、实例2 PhpStorm 通过正则表达式批量查找替换(删除一部分内容)
1)实现内容:
批量将iconv()函数中有“//IGNORE”的配置去掉,即:
$cusTitle = iconv('utf-8','GBK//IGNORE',$cusInfo['system_custom_'.$this->lan_key].$title_suffix);
批量替换为
$cusTitle = iconv('utf-8','GBK',$cusInfo['system_custom_'.$this->lan_key].$title_suffix);
2)实现方法一
在PhpStorm等编辑器中通过正则表达式批量查找替换;
*查找正则表达式:iconv\((['"][^'"]*['"])(,\s?)(['"])([^'"//]*)(?://IGNORE)([''])
*替换正则表达式:iconv\($1$2$3$4$5
解析一
具体解析见实例1
**圆括号中模式匹配到的内容会被顺序存储在临时缓存区中,通过
n
即
可
获
取
到
匹
配
到
的
对
应
内
容
,
<
f
o
n
t
c
o
l
o
r
=
"
r
e
d
"
>
可
用
非
捕
获
元
字
符
?
:
放
在
括
号
括
起
来
的
模
式
前
来
重
写
捕
获
,
忽
略
对
相
关
匹
配
的
保
存
;
<
/
f
o
n
t
>
∗
∗
因
为
是
要
删
除
一
部
分
内
容
,
即
删
除
的
内
容
是
不
需
要
缓
存
到
临
时
缓
冲
区
的
,
这
样
在
替
换
表
达
式
中
使
用
n即可获取到匹配到的对应内容,<font color="red">可用非捕获元字符 ?:放在括号括起来的模式前来重写捕获,忽略对相关匹配的保存;</font> **因为是要删除一部分内容,即删除的内容是不需要缓存到临时缓冲区的,这样在替换表达式中使用
n即可获取到匹配到的对应内容,<fontcolor="red">可用非捕获元字符?:放在括号括起来的模式前来重写捕获,忽略对相关匹配的保存;</font>∗∗因为是要删除一部分内容,即删除的内容是不需要缓存到临时缓冲区的,这样在替换表达式中使用n获取不到删除的内容,即可实现删除替换;
*(['"])([^'"//]*)(?://IGNORE)([''])
匹配到’GBK//IGNORE’,需要删除//IGNORE
,所以正则表达式为(?://IGNORE)
这样//IGNORE
便不会被保存在临时缓冲区中,这样在替换表达式中使用$n获取不到删除的内容,即可实现删除替换;
3)实现方法二
在PhpStorm等编辑器中通过正则表达式批量查找替换;
*查找正则表达式:iconv\((['"][^'"]*['"])(,\s?)(['"])([^'"//]*)(//IGNORE)([''])
*替换正则表达式:iconv\($1$2$3$4$6
解析二
和方法一的区别(//IGNORE)
的匹配结果存储在临时缓冲区内,对应$5,但是替换正则表达式中不是用此匹配的缓存结果,末尾的分号由$6替换;
*查找正则表达式:iconv\((['"][^'"]*['"])(,\s?)(['"])([^'"//]*)(//IGNORE)([''])
*替换正则表达式:iconv\($1$2$3$4$6