Pregunta

Tengo un montón de documentos que son de tipo HTML.Como en, se ven como HTML, pero tiene otras compone de etiquetas que no son una parte de HTML

<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>

Es necesario analizar estos archivos.PHP es la única herramienta disponible.Los documentos no se acercan a ser XML bien formado.

Mi idea original era utilizar el loadHTML métodos de PHPs DOMDocument.Sin embargo, estos métodos se ahogan en las etiquetas HTML, y se niegan a analizar la cadena/archivo.

$oDom = new DomDocument();
$oDom->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>");
//gives us
DOMDocument::loadHTML() [function.loadHTML]: Tag pseud-template invalid in Entity, line: 1 occured in ....

La única solución que he sido capaz de llegar a es para pre-procesar los archivos con la cadena de reemplazo de las funciones que le quite las etiquetas no válidas y reemplazarlos con la validez de una etiqueta HTML (tal vez un span con un id de el nombre de la etiqueta).

Hay una solución más elegante?Una manera de dejar a DOMDocument saber acerca de etiquetas adicionales para considerar como válida?Es allí una manera diferente, robusto análisis de HTML clase/objeto que hay para PHP?

(si no es obvio, no creo que las expresiones regulares una solución válida aquí)

Actualización:La información en la falsa etiquetas es parte de la meta aquí, algo así como Ordenado, no es una opción.También, estoy detrás de algo que hace el mismo nivel, si no todos, de la correcta forma de limpieza para mí, que es la razón por la que yo estaba mirando a la DomDocument del loadHTML método en el primer lugar.

¿Fue útil?

Solución

Puede suprimir advertencias con libxml_use_internal_errors, mientras que la carga del documento.Ej.:

libxml_use_internal_errors(true);
$doc = new DomDocument();
$doc->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>");
libxml_use_internal_errors(false);

Si, por alguna razón, usted necesita el acceso a las advertencias, el uso de libxml_get_errors

Otros consejos

Me pregunto si de pasar el "mal" a través de HTML HTML Tidy podría ayudar como un primer paso?Podría ser digno de una mirada, si usted puede conseguir el documento esté bien formado, tal vez usted podría cargar como un archivo XML con DomDocument.

@Twan Usted no necesita un DTD para DOMDocument para analizar XML personalizado.Sólo uso DOMDocument->load(), y mientras el XML está bien formado, puede leerlo.

Una vez que usted consiga los archivos a estar bien formado, que es cuando se puede empezar a buscar en los analizadores XML, antes de que estás S. O. L.Lok Alejo dijo: usted puede mirar HTML TIDY, pero parece que es específico para HTML, y no sé cómo iba a ir con sus propios elementos.

No considero expresiones regulares una solución válida aquí

Hasta que usted tiene la correcta forma, que podría ser su única opción.Una vez que obtenga los documentos a esa etapa, entonces usted está en el claro con el DOM funciones.

Echa un vistazo a el Analizador en el PHP Ajuste del puerto.El código es limpio y fue diseñado originalmente para cargar el HTML sucio salvos por medio de la Palabra.Está configurado para tirar de tablas, pero puede ser fácilmente adaptado.

Usted puede ver el código fuente aquí:http://gerd.exit0.net/pat/PHPFIT/PHPFIT-0.1.0/Parser.phps

La prueba de la unidad mostrará cómo usarlo:http://gerd.exit0.net/pat/PHPFIT/PHPFIT-0.1.0/test/parser.phps

Mi rápido y sucio solución a este problema fue a ejecutar un bucle que se ajuste a mi lista de etiquetas personalizadas con una expresión regular.La regexp no captura etiquetas que tienen otro interior de etiqueta personalizada dentro de ellos.

Cuando hay un partido, una función para procesar esa etiqueta se llama y devuelve el "procesado"HTML".Si esa etiqueta personalizada estaba dentro de otra etiqueta personalizada que el padre se convierte sin hijos por el hecho de que el HTML se ha insertado en el lugar del niño, y que se corresponde con la regexp y procesado en la siguiente iteración del bucle.

El bucle termina cuando no hay hijos de etiquetas personalizadas a ser igualado.En general, es iterativo (while) y no recursivos.

@Alan Tormenta

Tu comentario en mi otra respuesta me hizo pensar:

Cuando se carga un archivo HTML con DOMDocument, parece hacer algún nivel de limpieza re:bien, bien, correcto formateo, PERO requiere que todos sus etiquetas a ser de fiar etiquetas HTML.Estoy buscando algo que hace a la antigua, pero no la tarde.(Alan Tormenta)

Ejecutar un regex (lo siento!) sobre las etiquetas, y cuando encuentra uno que no es válido elemento HTML, reemplácelo con un elemento válido que sabemos que no existen en ninguno de los documentos (blink viene a la mente...), y darle el valor de un atributo con el nombre de la ilegal elemento, de modo que usted puede cambiar después.por ejemplo:

$code = str_replace("<pseudo-tag>", "<blink rel=\"pseudo-tag\">", $code);
// and then back again...
$code = preg_replace('<blink rel="(.*?)">', '<\1>', $code);

obviamente que el código no funciona, pero usted consigue la idea general?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top