用于替换与字符串数组匹配的非破折号字符的正则表达式
RegEx for replacing non-dash chars matching an array of strings
我在 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);
我当前解决方案的问题是它会替换所有非破折号字符,即使它们不匹配任何私有常量也是如此。
这是您可以随心所欲的一种方式。此代码使用 get_defined_constants
and array_filter
, converts them into regexes using array_map
and preg_quote
, and then uses preg_replace_callback
查找所有 PRIV*
常量,将字符串中所有出现的常量替换为 *
而不是 -
字符:
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.
我在 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);
我当前解决方案的问题是它会替换所有非破折号字符,即使它们不匹配任何私有常量也是如此。
这是您可以随心所欲的一种方式。此代码使用 get_defined_constants
and array_filter
, converts them into regexes using array_map
and preg_quote
, and then uses preg_replace_callback
查找所有 PRIV*
常量,将字符串中所有出现的常量替换为 *
而不是 -
字符:
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.