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

Trying to count characters after submitting a comment, mb_strlen gives back weird results

在我的控制器中,我使用 $this->request->data['Comment']['text'] 访问评论数据。我使用 CakePHP 的 formhelper 来构建表单,并使用一个名为 Summernote 的插件将文本区域转换为 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()!

计算它

我在这里测试过这个案例: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);