Limite la longitud de entrada del texto que contiene tags HTML

Tengo un sitio web de php en el que puedo gestionar artículos. En el formulario Agregar un nuevo artículo, hay un cuadro de texto enriquecido (permite la entrada de HTML) que me gustaría limitar el número de entradas de caracteres. Reviso en el lado del servidor para usar el strlen() Docs .

El problema es que strlen parece dar un número demasiado grande. Intenté usar html_entity_decode() Docs para obtener las tags html de la cadena, pero aún así la longitud de la cadena resultante parece ser incorrecta.

html_entity_decode solo decodifica las entidades HTML, no ignora las tags HTML. Tratar:

 strlen(strip_tags(html_entity_decode($string))); 

O el equivalente de múltiples bytes:

 mb_strlen(strip_tags(html_entity_decode($string)), 'auto'); 

Desea obtener el número de caracteres, pero no desea contar el marcado HTML.

Puede hacerlo utilizando un analizador HTML, como DOMDocument . Carga el documento (o fragmento), obtiene la etiqueta del cuerpo que representa el contenido de los documentos, obtiene su valor de nodeValue , normaliza el espacio en blanco y luego usa una función de conteo de caracteres compatible con 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')); 

Ejemplo de entrada test.html :

  

Ejemplo de salida:

 Length: 58 character(s). 

El texto normalizado es:

 1a. Nice to meet you! swfobject.registerObject('FlashID'); 

Tenga cuidado de que esto cuente el tamaño del texto, incluyendo cosas como el texto dentro de las tags .