【问题标题】:RegEx for replacing non-dash chars matching an array of strings用于替换匹配字符串数组的非破折号字符的正则表达式
【发布时间】:2019-09-28 21:47:11
【问题描述】:

我在 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);

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

【问题讨论】:

    标签: php regex string replace preg-replace


    【解决方案1】:

    这是您可以随心所欲的一种方法。此代码使用get_defined_constantsarray_filter 查找所有PRIV* 常量,使用array_mappreg_quote 将它们转换为正则表达式,然后使用preg_replace_callback 将字符串中所有出现的常量替换为@987654333 @-以外的@字符:

    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.
    

    Demo on 3v4l.org

    【讨论】:

    • 哇,好吧 - 当然它不是单行的,但它看起来很有希望。让我测试几分钟,如果我没有发现任何问题,我会标记为答案。谢谢!
    • @dokgu 您可以将所有代码合并到一行中,但这会很混乱! :-) 如果您不介意硬连线常量数组,您可以删除生成$priv_constants$regexes 的行。我只是想给你一些完全灵活的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2015-11-30
    • 2023-03-17
    • 2019-10-23
    • 2012-01-25
    • 2013-05-01
    • 2018-04-17
    相关资源
    最近更新 更多