2011-09-25 24 views
7

tengo una cadena con un cierto código HTML en, por ejemplo:¿Cómo buscar texto rodeado de comillas dobles con RegEx?

This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em> 

necesito que se deben eliminar el atributo id de cada etiqueta HTML, pero no tengo ninguna experiencia con las expresiones regulares, así que busqué aquí y allá de internet y escribí este patrón: [\s]+id=\".*\"

Desafortunadamente no está funcionando como era de esperar. De hecho, esperaba que la expresión regular capturara el id=" seguido de cualquier carácter repetido para cualquier número de veces y terminado con el más cercano comillas dobles; Prácticamente en este ejemplo, esperaba atrapar id="c1-id-8" y id="c1-id-9". Pero en su lugar el patrón me devolvió la subcadena id="c1-id-8">some</strong> <em id="c1-id-9", encuentra la primera aparición de id=" y la última aparición de un carácter de comillas dobles.

¿Podría decirme qué está mal en mi patrón y cómo solucionarlo, por favor? Muchas gracias

+2

Para las ∞ th tiempo, ** ** utilizar un analizador de HTML no es un lenguaje regular –

Respuesta

10

El cuantificador .* en su expresión regular es codicioso (lo que significa que coincide tanto como puede). Para que coincida con el mínimo requerido, puede usar algo como /\s+id=\"[^\"]*\"/. Los corchetes [] indican una clase de caracteres. Por lo tanto, coincidirá con todo dentro de los corchetes. El quilate [^] al comienzo de su clase de caracteres es una negación, lo que significa que coincidirá con todo excepto lo que se especifica en los corchetes.

Una alternativa sería la de contar la cuantificador .* ser perezoso cambiándola a .*? que coincidirá con tan poco como pueda.

+0

Muchas gracias, ahora entiendo cómo funciona: (1) comienza buscando cualquier cantidad de espacio + id = "(2) busca cualquier carácter hasta que se encuentra un carácter de comillas dobles (3) busca una comilla doble – Cesco

+1

Correcto. Y felicitaciones por salir e investigar su problema antes de publicarlo aquí, eso siempre es útil – nachito

+0

@ridgerunner Excelentes aclaraciones/correcciones. He editado mi respuesta para ser más preciso – nachito

0

Si sabe que su id siempre tiene 7 caracteres, puede hacerlo.

/\sid=".{7}"/g 

Así que ..

var a = 'This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>'; 

var b = a.replace(/\sid=".{7}"/g, ''); 

document.write(b); 

Ejemplo:http://jsfiddle.net/jasongennaro/XPMze/

Comprobar que el inspector pueda ver los id s retirados.

+0

Muchas gracias unfort... sin embargo, la cadena de identificación podría ser de cualquier longitud y no tengo control sobre ella :-( – Cesco

+0

No hay problema @Cesco. Encantado de ayudar. –

+0

Quien rechazó esto. No me importa el downvote, pero ¿podrías decirme por qué? –

3

En .* el asterisco es un cuantificador codicioso y coincide con tantos caracteres como sea posible, por lo que solo se detiene en el último " que encuentra.

Puede utilizar ".*?" para que sea perezoso, o (mejor OMI), utilice "[^"]*" para hacer el partido explícito:

"  # match a quote 
[^"]* # match any number of characters except quotes 
"  # match a quote 

Es posible que todavía tienen que escapar de las comillas si usted está construyendo la expresión regular de una cuerda; de lo contrario, eso no es necesario ya que las comillas no tienen caracteres especiales en una expresión regular.

+0

Gracias usted mucho para la explicación detallada – Cesco

1

Un analizador es la mejor solución en el caso general, pero se toman el tiempo para escribir.Hay casos en que escribir uno llevaría más tiempo del que guardaría el analizador sintáctico; tal vez este es un momento.

Lo que desea es un partido no codicioso o un partido más preciso./[\ s] + id = \ ". ? \"/hará el truco, pero [\ s] + id = \ "[^"] \ "será más rápido.

Tenga en cuenta que un completo regex que tiene en cuenta la posibilidad de caracteres de comillas escapadas, permite comillas simples en lugar de comillas dobles, y permite la ausencia de comillas en su totalidad sería mucho más complejo. Realmente querría un analizador en ese punto.

+0

Muchas gracias – Cesco

1

ejemplo con grep: (pero el punto es la expresión)

kent$ echo 'This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>'|grep -oP '(?<= id=")[^"]*(?=">)' 
c1-id-8 
c1-id-9 
+0

Gracias por este ejemplo – Cesco

Cuestiones relacionadas