正则表达式从类中排除某些符号,但扩展不包含的其他符号

问题描述 投票:0回答:1

我正在尝试编写一个正则表达式来生成 [:graph:] 类型的随机字符串,但排除字符串 $blacklist 中包含的一些特定字符(例如,特定语言键盘上可能缺少某些符号,并且不一定每个人都知道 ASCII或 Unicode 代码来制作它们),但可以在字符串 $whitelist 中包含其他内容,例如空格。

此代码允许您删除不属于 [:graph:] 的字符并在 PHP 中正常工作:

$secure_password = substr(preg_replace('`[^[:graph:]]+`s', "", random_bytes($length * 10)), 0, $length);

感谢 regex101.com,我找到了如何扩展模式以排除任何其他字符,即这样的:

#(?:[^[:graph:]]+|[~`]+)#

在上面,虽然“~`”符号包含在 [:graph:] 类中,但它们属于将被删除的符号。我知道我们需要使用 preg_quote 函数来转义正则表达式分隔符。

在其他代码中,我尝试扩展要删除的字符集:

$pattern = (empty($blacklist))
    ? "[^[:graph:]]+"
    : "(?:[^[:graph:]]+|[".preg_quote($blacklist, '`')."]+)";

$secure_password = substr(preg_replace($pattern, "", random_bytes($length * 10)), 0, $length);

但是效果不太好。

有人可以帮我吗?谢谢你。

php regex
1个回答
0
投票

当然,正则表达式不是生成密码的最佳方法,并且在数学上也无法保证所需的长度,但是OP询问如何使用白名单扩展他的脚本。我会使用负向前视并一一删除字符。

$blacklist = '~`';
$whitelist = ' ';
$delimiter = '`';
$length = 50;
$pattern = empty($whitelist) ? '' :
    '(?![' . preg_quote($whitelist, $delimiter) . '])';
$pattern .= empty($blacklist) ? '[^[:graph:]]'
    : '[[:^graph:]' . preg_quote($blacklist, $delimiter) . ']';

$secure_password = substr(preg_replace($delimiter . $pattern . $delimiter . 's', '', random_bytes($length * 10)), 0, $length);
© www.soinside.com 2019 - 2024. All rights reserved.