2010-10-27 13 views
10

Estoy revisando un sitio web grande (más de 16 páginas) para que apruebe la prioridad 1 W3C WAI. Como resultado, cosas como etiquetas de imagen deben tener atributos alt.Uso de expresiones regulares para encontrar etiquetas img sin un atributo alternativo

¿Cuál sería la expresión regular para encontrar etiquetas img sin atributos alt? Si es posible, con una pequeña explicación para que pueda usar para encontrar otros problemas.

Estoy en una oficina con Visual Web Developer 2008. El diálogo Editar >> Buscar puede usar expresiones regulares.

+1

No utilizaría expresiones regulares para esto. Prefiero usar algo como el paquete de agilidad html (http://htmlagilitypack.codeplex.com/) o alguna otra biblioteca de analizador HTML. – steinar

Respuesta

0

Esto es realmente complicado, porque las expresiones regulares se basan principalmente en hacer coincidir algo que está allí. Con el truco de la mirada, puede hacer cosas como 'encontrar A que no esté precedido/seguido por B', etc. Pero creo que la solución más pragmática para usted no sería esa.

Mi propuesta depende un poco de que tu código actual no hace las cosas demasiado locas, y es posible que tengas que afinarlo, pero creo que es una buena opción, si realmente quieres usar una búsqueda de RegEx para tu problema.

Así que lo que sugeriría sería encontrar todas las etiquetas IMG, que puede (pero no es necesario) tienen todos los atributos válidos para un elemento IMG. Si ese es un enfoque con el que puede trabajar es para que usted decida.

Propuesta:

/<img\s*((src|align|border|height|hspace|ismap|longdesc|usemap|vspace|width|class|dir|lang|style|title|id)="[^"]"\s*)*\s*\/?>/ 

Las limitaciones actuales son:

  1. Se espera que los valores de los atributos a estar delimitados por comillas dobles,
  2. No tener en cuenta posibles en línea * Atributos del evento,
  3. No encuentra elementos img con atributos 'ilegales'.
+0

No funcionó de manera directa, pero es una buena oportunidad para votar: he aprendido cosas de su respuesta, por ejemplo, la necesidad de finalmente familiarizarse con la expresión regular. También creo que Find de VS podría permitir búsquedas iterativas. Combinado con una instalación para poner una cuerda que NO ESTÁ allí (p. Ej., Alt = ") haría que esto fuera un obstáculo. Bueno, – awrigley

+0

@awrigley: ¿Ha sido capaz de identificar lo que no funciona? Por ejemplo, he incluía las barras '/' como delimitadores de RegEx. Eso podría no ser necesario en absoluto. Incluir todos los eventos (legales) no es nada difícil, solo que no quería escribir. Siempre y cuando las etiquetas de imagen actuales estén al menos tratando de ser válido, esto debería ser extensible a una expresión de búsqueda útil. – Thomas

+0

Lo he intentado sin los delimitadores también, pero no es una alegría. Creo que he localizado la mayoría de ellos manualmente, pero incluso presentando un error, los resultados fueron devueltos son 0. No puedo culparlo por no querer escribir. – awrigley

6

Esto funcionó para mí.

^<img(?!.*alt).*$ 

Esto coincide con cualquier cadena que comienza con <img que no contenga cualquier número de caracteres antes de un atributo alt. Incluso funciona para el tipo de atributos src="<?php echo $imagename; ?>".

6

Esto funciona en Eclipse:

<img(?!.*alt).*?>

estoy actualización de la sección 508 también!

+0

Un gran sitio para probar tus expresiones regulares es http://regexpal.com/. Yo uso eso y http://www.regular-expressions.info/ para construir la mina PERO nunca es fácil. –

+0

Eso funciona, Mr.Black, siempre que su etiqueta img no se rompa en varias líneas (muy posible con los sistemas de plantillas) porque el ". *" Dejará de coincidir entre los saltos de línea. Es más seguro buscar a cualquier personaje que no sea el corchete de cierre allí. Además, querrás asegurarte de que no estés combinando "class = 'baltic'" y omitir un verdadero positivo al buscar un salto de palabra antes de "alt". He proporcionado un ejemplo con explicación detallada en otro comentario, pero esto es lo que encontré que funciona: "] * \ balt =) [^>] *?>" – squareman

+0

Esto funcionó para mí en Visual Studio y en Sublime Text. – ajaykarwal

26

Basándose en Mr.Black y Roberts126 respuestas:

/(<img(?!.*?alt=(['"]).*?\2)[^>]*)(>)/ 

Esto corresponderá con una etiqueta img en cualquier parte del código que, o bien no tiene ninguna etiqueta alt o una etiqueta alt, que no vaya seguida de "=" o = '' (es decir, etiquetas alt no válidas).

Descomponiéndola:

(   : open capturing group 
<img  : match the opening of an img tag 
(?!  : open negative look-ahead 
.*?  : lazy some or none to match any character 
alt=(['"]) : match an 'alt' attribute followed by ' or " (and remember which for later) 
.*?  : lazy some or none to match the value of the 'alt' attribute 
\2)  : back-reference to the ' or " matched earlier 
[^>]*  : match anything following the alt tag up to the closing '>' of the img tag 
)   : close capturing group 
(>)  : match the closing '>' of the img tag 

Si su editor de código permite buscar y reemplazar por la expresión regular puede utilizar esto en combinación con la cadena de reemplazo:

$1 alt=""$3 

encontrar ninguna img alt-menos etiquetas y anexarlas con una etiqueta alt vacía. Esto es útil cuando se utilizan espaciadores u otras imágenes de diseño para correos electrónicos HTML y similares.

+1

Modifiqué esto para convertirme en '/ () *?) (/?>) /', Lo que significa que puede usar '\ 1 \ 2 alt = '' \ 3' como texto de reemplazo, y cualquier etiqueta con cierre automático permanecerá en el final. – BoffinbraiN

+0

@BoffinbraiN Se ve bien :) – Gruffy

+0

¿cómo actualizo la expresión regular para que actualice el atributo alt con el nombre de archivo img src? De: ' ' Para: 'w3schools w3schools' –

11

Esto es lo que he intentado en mi propio entorno con una base de código de la empresa masiva obteniendo buenos resultados (que se encuentra sin falsos positivos, pero casos válidos definitivamente encontrados):

<img(?![^>]*\balt=)[^>]*?> 

lo que está pasando en esta búsqueda:

  1. encontrar la apertura de la etiqueta
  2. aspecto de la ausencia de cero o más caracteres que no son el soporte de cierre y al mismo tiempo ...
  3. Comprobando la ausencia de una palabra que comienza con "alt" ("\ b" está ahí para asegurarnos de que no obtengamos una coincidencia de nombre de palabra intermedia en algo así como un valor de clase) y es seguido por "=" , entonces ...
  4. mirada de cero o más caracteres que no son el soporte de cierre
  5. encontrar el corchete de cierre

Así que esto coincidirá:

<img src="foo.jpg" class="baltic" /> 

Pero no corresponde a ninguno de de estos:

<img src="foo.jpg" class="baltic" alt="" /> 
<img src="foo.jpg" alt="I have a value."> 
0

simple y eficaz:

<img((?!\salt=).)*?

Esta expresión regular trabaja para encontrar <img> etiquetas que faltan el atributo alt.

Cuestiones relacionadas