首页 > 解决方案 > 用于替换匹配字符串数组的非破折号字符的正则表达式

问题描述

我在 PHP 中定义了一些常量,我认为它们是私有的,不应该显示在浏览器中。

const PRIV_API_KEY = '1234-5678-8426';
const PRIV_ACCESS_TOKEN = 'fnse0segh-23hfoeghl-fseuhosz';
...

如果我有这样的字符串

$message = 'Lorem ipsum dolor sit ammet 1234-5678-8426 bibendum id et dolor.';

1234-5678-8426可以是我上面提到的任何常量。-如果它们与任何私有常量匹配,我想替换除破折号 ( ) 之外的所有字符。

我想要实现的是:

Lorem ipsum dolor sit ammet ****-****-**** bibendum id et dolor.

到目前为止,我只是想出了一个正则表达式来替换非破折号字符。

$message = preg_replace('/[^-]/', '*', $message);

我当前解决方案的问题是它替换了所有非破折号字符,即使它们与任何私有常量都不匹配。

标签: phpregexstringreplacepreg-replace

解决方案


这是您可以做您想做的事情的一种方法。此代码使用 and 查找所有PRIV*常量,使用get_defined_constantsandarray_filter将它们转换为正则表达式array_mappreg_quote然后使用非字符preg_replace_callback替换字符串中所有出现的常量:*-

const PRIV_API_KEY = '1234-5678-8426';
const PRIV_ACCESS_TOKEN = 'fnse0segh-23hfoeghl-fseuhosz';
const NONPRIV_CONST = 42;

$priv_constants = array_filter(get_defined_constants(true)['user'], function ($k) { return substr($k, 0, 4) == 'PRIV'; }, ARRAY_FILTER_USE_KEY);
$regexes = array_map(function ($v) { return '/' . preg_quote($v) . '/' ; }, $priv_constants);

$message = 'Lorem ipsum dolor sit ammet 1234-5678-8426 bibendum id et dolor. Lorem ipsum dolor fnse0segh-23hfoeghl-fseuhosz sit ammet bibendum id et dolor.';

$message = preg_replace_callback($regexes, function ($m) { return preg_replace('/[^-]/', '*', $m[0]); }, $message);
echo $message;

输出:

Lorem ipsum dolor sit ammet ****-****-**** bibendum id et dolor. Lorem ipsum dolor *********-*********-******** sit ammet bibendum id et dolor.

3v4l.org 上的演示


推荐阅读