如何用 "preg_replace" 或更短的代码隐藏特定的 post?

How to hide a particular post with "preg_replace" or shorter code?

如何使用 PHP "preg_replace" 或更短的代码隐藏特定的 post?

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

$string = "pub-9752787982789258";

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

结果:

pub-97527******89258

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

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

参见PHP demo and a 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, 0, 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, '******', -11, -5);

echo "\n---\n";

echo substr_replace($string, '******', 9, 6);

echo "\n---\n";

echo substr_replace($string, '******', 9, -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