0

在我的控制器中,我使用$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() 计算它!

4

1 回答 1

0

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

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

textarea 标记会将格式化空格包含在值中。
查看为什么 textarea 充满了神秘的空白?

因此,您可以这样做:

$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);
于 2017-01-17T11:56:58.697 回答