我使用document.getElementById("text").value.length
通过javascript获取字符串长度,使用mb_strlen($_POST['text'])
通过PHP获取字符串长度,两者都有很大不同。在获取字符串长度之前,在javascript中转换回车符,但我猜有些字符没有计算在内。
例如,
并[b] 15。 Umieszczanie obrazka z logo nastroniezespołu[/ b]
这个文本块在javascript中计算57,在PHP中计算58。当文本变长时,差异会增加。有没有办法克服这个问题?
答案 0 :(得分:4)
如果您尝试在PHP中获取UTF-8编码字符串的长度,则应在mb_strlen
的第二个参数中指定编码,如下所示:
mb_strlen($_POST['text'], 'UTF-8')
另外,不要忘记在POST-var。
上调用stripslashes
答案 1 :(得分:2)
我找到了一个针对Javascript的mb_strlen等效函数,这可能对其他人有用:
function mb_strlen(str) {
var len = 0;
for(var i = 0; i < str.length; i++) {
len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? 2 : 1;
}
return len;
}
感谢所有想要帮助的人!
答案 2 :(得分:0)
我注意到那里有一个非标准字符(ł) - 我不确定PHP如何计算非标准 - 但它可能算作两个。如果您在没有该角色的情况下运行测试会发生什么?
答案 3 :(得分:0)
这应该可以解决问题
function mb_strlen (s) {
return ~-encodeURI(s).split(/%..|./).length;
}
答案 4 :(得分:0)
只需在您的文本区域输入多于一行,您就会看到差异越来越大... 这是因为当所有 PHP 长度函数都将它们考虑在内时,Javascript value.length 不会计算行尾。 就这样做:
// In case you're using CKEditot
// id is the id of the text area
var value = eval('CKEDITOR.instances.'+id+'.getData();');
// String length without the CRLF
var taille = value.length;
// get number of line
var nb_lines = (value.match(/\n/g) || []).length;
// Now, this value is the same you'll get with strlen in PHP
taille = taille + nb_lines;