2010-03-12 16 views
19

¿Es posible hacer una sustitución de expresiones regulares en todas las etiquetas IMG que están cerradas? En caso afirmativo, ¿cómo puedo identificar a:Cerrar todas las etiquetas IMG no cerradas HTML

<img src="..." alt="..."> 

... como posible canidato para ser reemplazado?

= <img src="..." alt="..."/> 

Actualización: Tenemos cientos de páginas y miles de etiquetas de imágenes, todas ellas deben estar cerradas. No estoy atascado en RegEx - cualquier otro método, aparte de actualizar manualmente todas las etiquetas IMG, sería suficiente.

+3

muy buena pregunta de hecho +1! – ant

+0

¿Estás usando HTML o XHTML? – Gumbo

+1

Parece que estaba usando HTML y tiene que cambiar a XHTML, ¿no es así? –

Respuesta

13
(<img[^>]+)(?<!/)> 

coincidirá con una etiqueta img que no está cerrada correctamente. Requiere que el sabor de la expresión regular que está usando respalde el aspecto subyacente (lo que Ruby y JavaScript no hacen, pero la mayoría lo hace). Referencia posterior no. 1 contendrá la coincidencia, por lo que si busca esta expresión regular y la reemplaza por \1/>, debería estar listo.

Si usted necesita para tener en cuenta la posibilidad de > atributos en el interior, se puede usar

(<img("[^"]*"|[^>])+)(?<!/)> 

Esto corresponderá, por ejemplo,

<img src="image.gif" alt="hey, look--->"> 
<img src="image/image.gif"> 

y dejar

<img src="image/image.gif" /> 

solos .

+0

¿Supone esto que el elemento 'img' ocupa una sola línea de texto? –

+0

No, no es así. –

+0

Sin embargo, supone que el texto alternativo y el título no contienen un '>'. (Que no está garantizado, con cientos de páginas de código). –

3

En HTML, la etiqueta de finalización de <img> "debe omitirse", por lo que la etiqueta de inicio cierra el elemento y no puede tener una img no cerrada.

Si desea convertir su HTML a XHTML, utilice un analizador real. Las expresiones regulares no son una herramienta muy buena para este trabajo.

+0

¡los analizadores regulares de XML no aceptarán una etiqueta abierta! – Dejell

+1

@Odelya - Cuando dije "use un analizador real" quise decir un analizador HTML, no un analizador XML. Como HTML no es XML, esto parecía obvio. – Quentin

0

¿Qué quiere decir con "unclosed"?

<img src="a1.jpg <--no ending quotes and end parens 
<img src="a1.jpg" <-- no end parens 
<img src="a1.jpg"> <-- the tag does not self-close as should be done in XHTML 

Puede tratar de encontrar inteligente tales sospechosos, pero que nunca se garantiza que sea a prueba de tontos.

-1

Nunca he intentado esto, pero una etiqueta de img cerrada es una etiqueta que comienza con <img con productos y un /> al final.

Aquí es algo que intentó en Perl

!/usr/bin/env perl 

my @images = ('<img src="toto.jpg">', 
      '<img src="truc/machin.jpg" title="pouet" >', 
      '<img  src="pouet.jpg" alt="toto" />', 
      '<img src="math/a-greater-than-b.png" alt="a > b">'); 

foreach (@images) { 
    if (/<img\s+(([a-z]+=".*?")+\s*)>/) { 
    print "Match : <img $1 />\n"; 
    } 
} 

Produce:

Match : <img src="toto.jpg" /> 
Match : <img src="truc/machin.jpg" title="pouet" /> 
Match : <img src="math/a-greater-than-b.png" alt="a > b" /> 
+1

Y se rompe si los valores de los atributos no están entre comillas (¡válidos!) O citados con comillas simples (¡válido!) O si el nombre del atributo contiene caracteres no alfanuméricos (datos de HTML5 foo) o si el nombre del atributo incluye mayúsculas. – Quentin

+0

mayúscula es fácil de tratar. Pensé que las citas simples no estaban permitidas, pero no es el caso. Nuevamente, fácil de reemplazar: reemplace "por ['"] pero es adecuado para caracteres no alfa. Una vez más, creo que se puede hacer, pero la especificación tiene que ser más precisa. Sin embargo, es posible realizar esta tarea de forma automática, pero (tal vez) no solo con regexp. expresiones regulares son solo un primer filtro bastante bueno. Puedo ser suficiente si el esquema de la url es siempre el mismo en sus páginas. Thans para su comentario de todos modos. – Aif

+0

Reemplazando '" 'con' ["']' provocaría que se rompa para 'foo =" bar' baz 'bar "'. HTML es ** no ** simple de analizar con expresiones regulares. – Quentin

Cuestiones relacionadas