如果您只需要在匹配特定格式的字符串中将子字符串隐藏在中间,则可以使用
preg_replace('~(?:\G(?!^)|^pub-\d{5}(?=\d*$))\K\d(?=\d{5})~','*',$string)
请参见PHP demo和regex demo。
详细信息
-
(?:\G(?!^)|^pub-\d{5}(?=\d*$))
-上一次成功匹配的结尾,或者pub-
在字符串的开头,然后是5位数字,其后是直到字符串末尾的任意0+数字,然后是
-
\K
-省略了到目前为止匹配的文本
-
\d
-匹配任意一位数字
-
(?=\d{5})
-确保右侧有五个数字。
,
您尝试过这种方法吗?
echo substr_replace($string,'******',9,strlen($string) -14 );
,
鉴于字符串宽度是固定的,我建议在这里避免使用正则表达式,而只使用基本字符串函数:
$string = "pub-1885335825402893";
$output = substr($string,9) . "******" . substr($string,15,5);
echo $output;
pub-18853******02893
,
由于输入经过严格格式化且具有静态长度,因此无需进行正则表达式调用,而只需一个函数调用即可完成此操作(使其更易于阅读和维护,并且效率更高)。
从正面以正整数开始或从背面以负整数开始计算到正确的位置,然后将替换长度设置为等于星号的数量。
我的preg_replace()
通话是时间最长,效率最低的技术。它会消耗掉并忘记前5位数字,然后替换后6位数字。
要进行单个替换,最后两种技术(带有\G
的正则表达式可以继续元字符或for
循环)可以完成任务。正则表达式的效率甚至会比早期的正则表达式低。 for()
循环可能具有竞争优势,但是我看不出为您的方案进行6个单独替换的好处。
代码:(Demo)
$string = "pub-1885335825402893";
echo substr_replace($string,-11,6);
echo "\n---\n";
echo substr_replace($string,-5);
echo "\n---\n";
echo substr_replace($string,-5);
echo "\n---\n";
echo preg_replace('~\d{5}\K\d{6}~',$string);
echo "\n---\n";
echo preg_replace('~(?:\G(?!^)|^pub-\d{5})\K\d(?=\d{5})~',$string);
echo "\n---\n";
for ($offset = 9; $offset <= 14; ++$offset) {
$string[$offset] = '*';
}
echo $string;
输出:
pub-18853******02893
---
pub-18853******02893
---
pub-18853******02893
---
pub-18853******02893
---
pub-18853******02893
---
pub-18853******02893
---
pub-18853******02893
本文链接:https://www.f2er.com/3162889.html