У меня есть веб-сайты php, в которых я могу управлять статьями. В поле «Добавить новую статью» есть богатый текстовый ящик (позволяет вводить HTML-код), что я хотел бы ограничить количество ввода символов. Я проверяю серверную сторону, используя метод strlen()
Docs .
Проблема в том, что strlen
похоже, дает число, которое слишком велико. Я попытался использовать html_entity_decode()
Docs, чтобы вывести html-теги из строки, но все же длина строки, по-видимому, неверна.
html_entity_decode
только декодирует объекты HTML, он не игнорирует теги HTML. Пытаться:
strlen(strip_tags(html_entity_decode($string)));
Или многобайтовый эквивалент:
mb_strlen(strip_tags(html_entity_decode($string)), 'auto');
Вы хотите получить количество символов, но вы не хотите считать разметку HTML.
Вы можете это сделать, используя парсер HTML, например DOMDocument
. Вы загружаете документ (или фрагмент), получаете тег body, который представляет содержимое документов, получают его nodeValue
, нормализуют его пробелы, а затем вы используете функцию подсчета символов, совместимую с UTF-8:
$doc = new DOMDocument(); $doc->loadHTMLFile('test.html'); $body = $doc->getElementsByTagName('body')->item(0); $text = $body->nodeValue; $text = trim(preg_replace('/\s{1,}/u', ' ', $text)); printf("Length: %d character(s).\n", mb_strlen($text, 'utf-8'));
Пример ввода test.html
:
<body> <div style='float:left'><img src='../../../../includes/ph1.jpg'></div> <label style='width: 476px; height: 40px; position: absolute;top:100px; left: 40px; z-index: 2; background-color: rgb(255, 255, 255);; background-color: transparent' > <font size="4">1a. Nice to meet you!</font> </label> <img src='ENG_L1_C1_P0_1.jpg' style='width: 700px; height: 540px; position: absolute;top:140px; left: 40px; z-index: 1;' /> <script type='text/javascript'> swfobject.registerObject('FlashID'); </script> <input type="image" id="nextPageBtn" src="../../../../includes/ph4.gif" style="position: absolute; top: 40px; left: 795px; "> </body>
Пример вывода:
Length: 58 character(s).
Нормализованный текст:
1a. Nice to meet you! swfobject.registerObject('FlashID');
Позаботьтесь, чтобы это учитывало размер текста, включая такие вещи, как текст внутри тегов <script>
.