2009-06-07 9 views
8

Tengo problemas para escribir una expresión regular (adecuada para preg_match de PHP()) que analizará palabras clave = pares de 'valores' independientemente de si el valor > la cadena está encerrada en comillas simples o dobles. OIA en los dos casos siguientes necesito para obtener el nombre < > y <valor> donde el <valor> cadena puede contener el tipo no-envolvente de cotizaciones:Necesita regex para analizar palabra clave = 'valor' con comillas simples o dobles

name="value" 
name='value' 

Respuesta

14

En Perl se trata de una expresión regular que trabajaría. Primero coincide para el inicio de la línea y luego coincide para uno o más caracteres que no son = y los establece en $ 1. A continuación se busca el = a continuación los unos no paréntesis, con una opción de juego para "o" y establece que a $ 2.

/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/ 

Si quería para que coincida con expresiones en blanco similares.

Este =" "

Reemplazar los dos últimos + con un * de lo contrario, esto debería funcionar

Editar Como se ha mencionado en los comentarios. Doug utiliza ...

/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/ 

Esto coincidirá con un espacio en blanco opcional en el extremo del éter de la entrada o el valor y ha eliminado el marcador de fin de línea.

+2

que coincidirá con name = "asd" con una doble cita en el y, eso no es correcto –

+1

Ya no coincide con conjuntos no cita coincidente – Copas

+0

argh informado antes de que mi respuesta:..! P –

4
/^(\w+?)=(['"])(\w+?)\2$/ 

que pondrá la llave en $1 y el valor en $3.

1

unos años de retraso, pero ya que esta cuestión es altamente clasificado en Google, y las respuestas no satisfizo mis necesidades, aquí hay otro expression:

(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2 

Esto corresponderá con comillas simples o dobles, teniendo en cuentas escapadas de la cuenta y valores sin comillas.

name = bar 
name = "bar" 
name = 'bar' 
name = "\"ba\"r\"" 

Es, sin embargo, tiene una limitación en que si se pierde un valor la llave del siguiente par clave/valor que se lee. Esto se puede abordar utilizando un comma separated list de pares clave/valor.

Cuestiones relacionadas