2011-09-25 18 views
7

Ho una stringa con del codice HTML, per esempio:Come cercare il testo circondato da virgolette con RegEx?

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

ho bisogno per togliere l'attributo id da ogni tag HTML, ma non ho alcuna esperienza con le espressioni regolari, così ho cercato qua e là da internet e ho scritto questo modello: [\s]+id=\".*\"

Sfortunatamente non funziona come mi aspetterei. Infatti, speravo che l'espressione regolare catturasse lo id=" seguito da qualsiasi carattere ripetuto per un numero qualsiasi di volte e terminato con il più vicino doppio; Praticamente in questo esempio mi aspettavo di prendere id="c1-id-8" e id="c1-id-9". Invece il pattern mi ha restituito la sottostringa id="c1-id-8">some</strong> <em id="c1-id-9", trova la prima occorrenza di id=" e l'ultima occorrenza di un carattere di virgoletta doppia.

Potrebbe dirmi cosa c'è di sbagliato nel mio schema e come risolverlo, per favore? Grazie mille

+2

Per i ∞ ° tempo, ** utilizzare un parser ** HTML non è un linguaggio regolare –

risposta

10

Il quantificatore .* nella tua espressione regolare è avido (il che significa che corrisponde il più possibile). Per abbinare il minimo richiesto potresti usare qualcosa come /\s+id=\"[^\"]*\"/. Le parentesi [] indicano una classe di caratteri. Quindi corrisponderà allo all'interno delle parentesi. La caratura [^] all'inizio della classe di caratteri è una negazione, ovvero corrisponderà a a tutto eccetto cosa viene specificato tra parentesi.

Un'alternativa sarebbe quella di dire al .* quantificatore di essere pigro cambiando a .*? che corrisponderà il meno che può.

+0

Grazie mille, ora capisco come funziona: (1) inizia con la ricerca di qualsiasi quantità di spazio + id = "(2) cerca qualsiasi carattere finché non viene trovato un carattere di doppia citazione (3) cerca una doppia citazione char. – Cesco

+1

Corretto. E complimenti per uscire e ricercare il tuo problema prima di postarlo qui, che è sempre utile – nachito

+0

@ridgerunner Ottimi chiarimenti/correzioni Ho modificato la mia risposta per essere più precisa – nachito

0

Se sai che il tuo id è sempre di 7 caratteri, puoi farlo.

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

Quindi ..

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); 

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

Controllare l'ispettore per vedere i id s rimossi.

+0

ringrazio molto Unfort... unicamente la stringa ID potrebbe essere di qualsiasi lunghezza e non ho alcun controllo su di essa :-( – Cesco

+0

Non è un problema @Cesco. Felice di aiutare. –

+0

Chiunque abbia downvoted questo. Non mi dispiace il downvote, ma potresti dirmi perché? –

3

In l'asterisco è un quantificatore avido e corrisponde a più caratteri che può, quindi si ferma solo nell'ultimo " che trova.

È possibile utilizzare ".*?" per renderlo pigro, o (meglio IMO), utilizzare "[^"]*" a fare la partita esplicito:

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

si potrebbe ancora bisogno di sfuggire le virgolette se si sta costruendo l'espressione regolare da una stringa; altrimenti non è necessario poiché le virgolette non sono caratteri speciali in un'espressione regolare.

+0

Grazie molto per la spiegazione dettagliata – Cesco

1

Un parser è la soluzione migliore nel caso generale, ma richiedono tempo per scrivere.Ci sono casi in cui scrivere uno richiederebbe più tempo di quanto il parser salverebbe; forse è un momento così.

Quello che vuoi è una partita non avara o una partita più precisa./[\ s] + id = \ ". ? \"/farà il trucco, ma [\ s] + id = \ "[^"] \ "sarà più veloce.

Si noti che un pieno regex che tiene conto della possibilità di caratteri di virgolette con escape, permette virgolette singole invece di virgolette doppie e consente l'assenza di virgolette interamente sarebbe molto più complessa.Verrebbe davvero un parser a quel punto.

+0

Grazie mille – Cesco

1

esempio con grep: (ma il punto è l'espressione)

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

Grazie per questo esempio – Cesco

Problemi correlati