【问题标题】:Trying to count characters after submitting a comment, mb_strlen gives back weird results提交评论后尝试计算字符数,mb_strlen 返回奇怪的结果
【发布时间】:2017-06-01 10:50:12
【问题描述】:

在我的控制器中,我使用$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 并且像一个魅力一样工作,但如果我进行唯一的检查,人们可以进入元素编辑器并重新启用提交按钮以发送他们喜欢的长 cmets。

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

请注意,与上面的示例不同,我尝试在此处发送“>>>”

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

编辑: Alex_Tartan 发现了问题:在用 mb_strlen() 计算字符串之前,我需要先对字符串执行 html_entity_decode()!

【问题讨论】:

  • 了解您在表单字段中输入的内容会很有用!
  • 你试过用 print_r() 代替 pr() 吗?编辑:它必须与编码有关->检查此link
  • @RiggsFolly 我输入了 '>',只是单个字符。

标签: php cakephp character-encoding charactercount


【解决方案1】:

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

更新(来自 cmets):

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

$data = html_entity_decode($data);

【讨论】:

  • var_dump($this->request->data) 实际上给了我一些有趣的东西:(我会在主帖中包含并编辑)
  • 好吧,一个 '>' 被转换成一个 '>',但是另外两个是从哪里来的呢?另外,您可能想html_entity_decode($data)
  • html_entity_decode 是我需要的!非常感谢您的帮助!同样在发布之间,我尝试使用“>>>”而不是“>”提交表单,这是其他两个“>”的位置来自。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多