在提交评论后尝试计算字符数,mb_strlen会返回奇怪的结果

时间:2017-01-17 11:32:13

标签: php cakephp character-encoding charactercount

在我的控制器中,我使用$this->request->data['Comment']['text']访问评论数据。我使用CakePHP的formhelper来构建表单,并使用一个名为Summernote的插件将textarea转换为WYSIWYG编辑器。我将评论保存为数据库中的HTML。

在这种情况下,我正在尝试使用'>'

提交评论
$data = $this->request->data['Comment']['text'];

pr($data);
//returns >

pr(mb_strlen($data, utf-8));
//returns 4

pr(mb_strlen('>', utf-8));
//returns 1
//that is the one that confuses me the most, 
//it seems that there's a difference between $data and '>'

mb_detect_encoding($data);
//returns ASCII

我已经使用jQuery来检查前端输入的字符数,因此当用户超过限制时我可以取消激活提交按钮。这使用.innerText.length并且像魅力一样工作,但如果我做了唯一的检查,那么人们可以进入元素编辑器并重新启用提交按钮以发送他们喜欢的长注释。

编辑: var_dump($ this-> request-> data [' Comment'] [' text'])给了我以下结果:

请注意,与上述示例不同,我正在尝试发送'>>>'这里

array (size=1)
  'text' => string '>>>' (length=12)

编辑: Alex_Tartan发现了问题:我需要在我的字符串上执行html_entity_decode(),然后用mb_strlen()计算它!

1 个答案:

答案 0 :(得分:0)

我在这里测试了这个案例:https://3v4l.org/VLr9e

可能的情况是未修剪的$data(白色空格不会出现在常规打印中 - 您可以使用var_dump($data))。

textarea标签将格式空格括在值中 查看Why is textarea filled with mysterious white spaces?

所以,你可以这样做:

$data = '>   ';
$data = trim($data);
// var_dump(data) will output: 
// string(4) ">   "

echo $data."\n";
//returns >

echo mb_strlen($data, 'UTF-8')."\n";
//returns 1

echo mb_strlen('>', 'UTF-8')."\n";
//returns 1

更新(来自评论):

问题是需要解码的html字符编码:

$data = html_entity_decode($data);