如何隐藏带有“ preg_replace”或更短代码的特定帖子?

如何使用PHP“ preg_replace”或更短的代码隐藏特定帖子?

我要在指定文本的pub- 之后显示前5位后5位数字。字符串始终以pub-开头,并且序列中始终有 16个数字。只有数字改变。我想用星号代替中间的6位数字。

$string = "pub-9752787982789258";

echo "pub-" . substr(explode("-",$string)[1],5) . '******' . substr(explode("-",11,5);

结果:

pub-97527******89258
solabc 回答:如何隐藏带有“ preg_replace”或更短代码的特定帖子?

如果您只需要在匹配特定格式的字符串中将子字符串隐藏在中间,则可以使用

preg_replace('~(?:\G(?!^)|^pub-\d{5}(?=\d*$))\K\d(?=\d{5})~','*',$string)

请参见PHP demoregex 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

大家都在问