php - 用于替换匹配字符串数组的非破折号字符的正则表达式
问题描述
我在 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);
我当前解决方案的问题是它替换了所有非破折号字符,即使它们与任何私有常量都不匹配。
解决方案
这是您可以做您想做的事情的一种方法。此代码使用 and 查找所有PRIV*
常量,使用get_defined_constants
andarray_filter
将它们转换为正则表达式array_map
,preg_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.
推荐阅读
- c# - Linq Left Join 选择一个集合作为属性
- javascript - 导航到另一个模块(Angular)中的组件
- react-native - Expo - React Native:如何从 Google Fit API 读取用户数据
- arduino - 使用分段 lcd (raspberry pi / arduino) 重新调整计算器的用途
- java - java中<字符的Jaxb解析
- java - 用类似的方法创建java接口
- c# - 如何使用 EF Core 在 .NET Core 3.1(无 LINQ)中为 CRUD 操作创建自定义扩展方法?
- workflow - 工作流 - 获取由字段创建的事务
- python - 使用 Colorama 在 ubuntu 终端中显示 Ansii 文本颜色
- python - 如何检查 QlistWidget 中的项目并在 python pyqt5 中的选定项目上运行函数