Ограничить длину ввода текста, содержащего HTML-теги

У меня есть веб-сайты php, в которых я могу управлять статьями. В поле «Добавить новую статью» есть богатый текстовый ящик (позволяет вводить HTML-код), что я хотел бы ограничить количество ввода символов. Я проверяю серверную сторону, используя метод strlen() Docs .

Проблема в том, что strlen похоже, дает число, которое слишком велико. Я попытался использовать html_entity_decode() Docs, чтобы вывести html-теги из строки, но все же длина строки, по-видимому, неверна.

Related of "Ограничить длину ввода текста, содержащего 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> .