2009-06-07 12 views
8

Ho problemi a scrivere un'espressione regolare (adatta per preg_match()) di PHP che analizzerà le coppie keyword = 'value' indipendentemente dal valore < > la stringa è racchiusa tra virgolette singole o doppie. IOW in entrambi i seguenti casi ho bisogno di ottenere il <nome> e <valore> dove il > stringa < valore può contenere il tipo non racchiude di citazioni:Hai bisogno di regex per analizzare keyword = 'value' con virgolette singole o doppie

name="value" 
name='value' 

risposta

14

In Perl si tratta di un'espressione regolare che funzionerebbe. Viene dapprima abbinato all'inizio della riga, quindi corrisponde a uno o più non = caratteri e li imposta a $ 1. Successivo Sembra per i = allora le a non parentesi con una scelta di corrispondenza per "o 'e imposta che a $ 2.

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

Se si voleva abbinare espressioni vuote come.

Questa =" "

Sostituire gli ultimi due + con un * in caso contrario, questo dovrebbe funzionare

Modifica Come accennato nei commenti. Doug utilizzato ...

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

Questo corrisponderà a uno spazio bianco opzionale sull'estremità etere dell'input o del valore e ha rimosso il marcatore di fine riga.

+2

corrisponderà al nome = 'asd "con una virgoletta doppia al e, che non è corretto –

+1

Non corrisponde più alle virgolette non corrispondenti – Copas

+0

argh! L'hai aggiornato prima della mia risposta: P –

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

che porrà la chiave nella $1 e il valore in $3.

1

Pochi anni di ritardo, ma dal momento che la questione è altamente classificato su google, e le risposte non ha soddisfatto le mie esigenze, ecco un altro expression:

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

Ciò corrisponderà virgolette singole o doppie, tenendo citazioni sfuggite all'account e valori non quotati.

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

Esso, tuttavia, ha una limitazione che se un valore è mancante la chiave dalla successiva coppia chiave/valore viene letto. Questo può essere risolto utilizzando un comma separated list di coppie chiave/valore.

Problemi correlati