Пытаясь посчитать символы после отправки комментария, mb_strlen возвращает странные результаты

В моем контроллере я получаю доступ к данным комментариев с помощью $this->request->data['Comment']['text'], Я использую помощник по формам CakePHP для создания формы и плагин 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 ()!

0

Решение

Я проверил случай здесь: https://3v4l.org/VLr9e

Какие может быть будь то дело не обрезается $data (пробелы не будут отображаться в обычной печати — вы можете использовать var_dump($data)).

Тег 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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector