排查错误的时候发现有一个手机号码 格式无误,正则表达式匹配也没有问题 但就是匹配不上,而其他号码却能匹配得上
将整个文本复制后粘贴到idea上发现 居然出现了一些肉眼看不到的特殊字符,也不是空格……….
经查阅资料后发现 居然是unicode字符,于是需要将其替换
三种字符的unicode编码为 不过 unicode 字符是区分大小写的 而 这三种字符在PHP中都是小写格式
LRO \u202D
PDF \u202C
RLO \u202E
unicode编码函数
//字符串转Unicode编码
function unicode_encode($strLong)
{
$strArr = preg_split('/(?<!^)(?!$)/u', $strLong);//拆分字符串为数组(含中文字符)
$resUnicode = '';
foreach ($strArr as $str) {
$bin_str = '';
$arr = is_array($str) ? $str : str_split($str);//获取字符内部数组表示,此时$arr应类似array(228, 189, 160)
foreach ($arr as $value) {
$bin_str .= decbin(ord($value));//转成数字再转成二进制字符串,$bin_str应类似111001001011110110100000,如果是汉字"你"
}
$bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/', '$1$2$3', $bin_str);//正则截取, $bin_str应类似0100111101100000,如果是汉字"你"
$unicode = dechex(bindec($bin_str));//返回unicode十六进制
$_sup = '';
for ($i = 0; $i < 4 - strlen($unicode); $i++) {
$_sup .= '0';//补位高字节 0
}
$str = '\\u' . $_sup . $unicode; //加上 \u 返回
$resUnicode .= $str;
}
return $resUnicode;
}
unicode 解码函数 借助 json编码
//Unicode编码转字符串
function unicode_decode($str)
{
$json = '{"str":"' . $str . '"}';
$arr = json_decode($json, true);
if (empty($arr)) return '';
return $arr['str'];
}
过滤函数
/**
* 过滤 unicode 编码 特殊 控制字符 RLO,LRO,PDF https://www.pianshen.com/article/1580630125/
* @param $str
* @return mixed|string
*/
function filterUnicodeControlChar($str)
{
$str = unicode_encode($str);
// 这三种字符 大小写转换其实都一样 但是 unicode 大小写又是敏感的..... 索性针对这三种字符串忽略大小写替换
$str = str_ireplace(["\u202D", "\u202C", "\u202E"], "", $str);
return unicode_decode($str);
}