我想要在我的网站上计算文本框中字符的数量。文本框接受用户输入的任何类型,包括ASCII艺术和其他特殊字符。如果用户输入普通字符,我可以使用strlen($message)来返回值,但是如果用户使用特殊字符(例如Â或©),计数将不正确。
有没有简单的方法来计算所有内容而不需要做任何繁重的工作?
有没有简单的方法来计算所有内容而不需要做任何繁重的工作?
$count = preg_match_all('/\X/u', $text);
这里有一些解释。Unicode图形字符是“字符”(Unicode代码点),包括可以跟随它们的“组合标记”。
mb_strlen($text, 'UTF-8')
会将组合标记计算为单独的字符(而strlen($text)
会给出总字节数)。
由于根据你的评论,你的输入可能已经将某些字符转换为它们的HTML实体等效项,因此你应该首先执行html_entity_decode()
:
$count = preg_match_all('/\X/u', html_entity_decode($text, ENT_QUOTES, 'UTF-8'));
更新
现在,intl
PECL扩展提供了grapheme_strlen()
和其他grapheme_*()
函数(当然,只有安装了intl
PECL扩展才能使用)。
给你。
function countumlauts($str) {
return strlen($str) - iconv_strlen($str);
}
它的工作原理:特殊字符使用多个字节。 strlen 计算字节数,而 iconv_strlen 则计算字符数。
对于我来说,strlen和mb_strlen都能正常工作。
可能是输入的特殊字符无法显示(Unicode)。因此,请尝试哪些字符是不可读的。
希望这可以帮到你。
mb_strlen()
只会计算“字符”,但是有些字符不会显示,有些字符会修改前面的字符(至少在 Unicode 中是这样),等等。 - Walter Tross