我怎样才能更好地计算符号并将所有可能的符号集成到我的正则表达式中(a-zA-Z0-9ßäÄöÖüÜ 除外)?

How can I count Symbols a better way and integrate all possible Symbols in my RegEx (except a-zA-Z0-9ßäÄöÖüÜ)?

首先我用谷歌搜索并在 Whosebug 中搜索,但没有适合我的问题,所以我创建了一个问题:

我使用 TYPO3 8.7.7,但认为这对那个问题不重要。

我想计算密码字符串中的符号数,以便根据我从该函数的注释中动态获取的数字值对其进行检查。

我的测试密码是abcDEF123456^°!"§$%&/()=?`ßöäüÖÄÜ€@;,:.-_#'+*/\-+*/=

首先我删除所有字母数字字符,包括德语特殊字符。

// Remove all Non-Symbols
$symbolsOnly = preg_replace('/([[:alpha:][:digit:]äÄöÖüÜß])/', '', $password);
// Count Symbols
$symbolCount = strlen($symbolsOnly);

$symbolsOnly的调试:

$symbolsOnly

'^°!"§$%&/()=?`€@;,:.-_#'+/-+/=' (37 chars)

我这里只有 33 个真实字符,但 Debug 计数为 37 个字符。

所以我开始 JSON-Debug:

json_encode($symbolsOnly)

'"^\u00b0!\"\u00a7$%&/()=?`\u20ac@;,:.-_#'+/\-+/="' (55 chars)

只是计算

如果我删除 \u00b0(6 个字符)、\u00a7(6 个字符)和 \u20ac(6 个字符),我得到 18 个字符.

如果我从 "(1 个字符)、/(3 个字符)、\(1 个字符)中删除转义 \ 我得到了 5 个字符.

如果我删除前导 " 和结尾 " 我得到 2 个字符

55 - 18 - 5 - 2 = 30 个字符。

现在如果添加 3 个字符(完整的 "converted" 而不仅仅是 "this calculation" 第一行的转义字符,我得到了 33 个字符。

所以 json_encode 工作正常。


我在 google 上多搜索了一下,也用 Whosebug,所以我得到了一些替换 3 "bad symbols" 的信息。

/**
 * Replace: ° (json: \u00b0 hex: \xB0     ),
 *          § (json: \u00a7 hex: \xA7     ),
 *          € (json: \u20ac hex: \x{20AC} )
 * With:    ^ (a countable character)
 */
$symbolsOnly = preg_replace('/(\xB0|\xA7|\x{20AC})/u', '^', $symbolsOnly);

现在我的调试看起来正确了:

$symbolCount

33 (integer)

但是我是否忘记了一些字符,如果我用 strlen() 计算它可以匹配多个字符?

您可以使用 mb_strlen() 来计算 multi-byte 个字符:

$password = 'abcDEF123456^°!"§$%&/()=?`ßöäüÖÄÜ€@;,:.-_#\'+*/\-+*/=';
$symbolsOnly = preg_replace('/([[:alpha:][:digit:]äÄöÖüÜß])/', '', $password);
$symbolCount = mb_strlen($symbolsOnly);
echo $symbolCount ; // 33