php - 在字符串中的正则表达式之后替换随机文本

时间:2015-01-26 12:40:36

标签: php regex

我已经继承了这个脚本,其中一些敏感信息存储在数据库中......我希望在保存并呈现给它之前用********替换它。日志中。

我正在使用PHP ...敏感信息是一组随机生成的字符,例如:" yYng6Ytzh" (不包括"报价"但有时它也可能包括!' s和@' s)

它始终遵循"密码:"的正则表达式。 (再次没有引号)例如:密码:yYng6Ytzh并被存储在单个字符串中的其他文本包围。

我一直在尝试preg_match,preg_replace的各种组合,包括带有偏移的str_replace,但我没有得到任何地方......(我只是帮助某人)通常我能找到我想在网上做些什么并且糊里糊涂,但我绝不是一个完全成熟的php程序员,这个让我难过。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

您可以匹配密码,然后使用后视来检查" Password:"在它的前面:

/(?<=Password:)\s*[a-zA-Z0-9!@]+/

编辑:我不得不将量词移到后面。这意味着您需要在使用前修剪匹配。

您也可以使用命名组进行匹配。它有点清洁,imo。

/(?<=Password:)\s*(?P<password>[a-zA-Z0-9!@]+)/

答案 1 :(得分:0)

您可以尝试此解决方案:

$string = preg_replace_callback('#(?<=Password: )([^ ]+)#', function($match) {
                                                                return str_repeat('*', strlen($match[1]));
                                                            }, 'Password: yYng6Ytzh');

var_dump($string);

答案 2 :(得分:0)

不仅要编辑密码,还要使原始密码的长度与替换文本的长度无关。与其使用星号,不如使用[redacted]。尽管您知道可以预测的字符范围(字母数字加@!),但我认为保持正则表达式的这一部分不紧密没有任何好处。使用非空白字符\S可以很好地保持图案很小。不用使用环视或捕获组,而只需使用\K来忘记匹配的Password: 子字符串。

代码:(Demo

$email = <<<TEXT
Dear Some Name,
here is your password
...or click the link to login... someurl.com?action=Log%20In&username=someuser@test.com&…
Your log in details are:
Username: your full email address (where this email was received)
Password: yYng6Ytzh Some more bla bla Kind Regards, Admin
TEXT;

echo preg_replace('~Password: \K\S+~', '[redacted]', $email);

输出:

Dear Some Name,
here is your password
...or click the link to login... someurl.com?action=Log%20In&username=someuser@test.com&…
Your log in details are:
Username: your full email address (where this email was received)
Password: [redacted] Some more bla bla Kind Regards, Admin