data una stringa come questa:Come faccio a far corrispondere il testo in HTML che non è all'interno dei tag?
<a href="http://blah.com/foo/blah">This is the foo link</a>
... e una stringa di ricerca come "pippo", vorrei evidenziare tutte le occorrenze di "pippo" nel testo del HTML - ma non all'interno di una etichetta. In altre parole, voglio ottenere questo:
<a href="http://blah.com/foo/blah">This is the <b>foo</b> link</a>
Tuttavia, una semplice ricerca e sostituzione non funzionerà, perché corrisponderà parte dell'URL nel < a> href del tag.
Quindi, per esprimere quanto sopra nella forma di una domanda: Come limitare una regex in modo che corrisponda solo al testo al di fuori dei tag HTML?
Nota: Vi prometto che il codice HTML in questione non sarà mai nulla di patologico simile:
<img title="Haha! Here are some angle brackets to screw you up: ><" />
Edit: Sì, certo mi rendo conto che ci sono le librerie complesse in CPAN in grado di analizzare anche l'HTML più atroce, e quindi alleviare la necessità di una regex di questo tipo. In molte occasioni, è quello che userei. Tuttavia, questa non è una di quelle occasioni, dal momento che mantenere questo script breve e semplice, senza dipendenze esterne, è importante. Voglio solo una regex di una sola riga.
Modifica 2: Ancora una volta, so che Template :: Refine :: Fragment può analizzare tutto il mio codice HTML per me. Se scrivessi un'applicazione , utilizzerei sicuramente una soluzione del genere. Ma questa non è un'applicazione. È a malapena più di uno script di shell. È un pezzo di codice usa e getta. Essendo un singolo file autonomo che può essere passato in giro è di grande valore in questo caso. "Ehi, esegui questo programma" è un'istruzione molto più semplice di "Ehi, installa un modulo Perl e poi esegui questo - aspetta, cosa, non hai mai usato CPAN prima?" Ok, esegui perl -MCPAN -e shell (preferibilmente come root) e poi ti farà un sacco di domande, ma non hai davvero bisogno di rispondere loro No, non aver paura, questo non spezzerà nulla. Guarda, non hai bisogno per rispondere con attenzione a ogni domanda, basta premere Invio più volte No, lo prometto, non spezzerà nulla ".
Ora moltiplica quanto sopra per una grande quantità di utenti che si stanno chiedendo perché il semplice script che hanno utilizzato non sia più così semplice, quando tutto ciò che è cambiato è rendere il termine di ricerca in grassetto.
Così mentre Template :: Refine :: Fragment può essere la risposta alla domanda di analisi HTML di qualcun altro, non è la risposta a questa domanda. Voglio solo un'espressione regolare che lavori sul sottoinsieme molto limitato dell'HTML che verrà effettivamente richiesto allo script di analizzare.
Vero ... questo è parte del motivo per cui gli altri stanno dicendo che dovresti davvero usare un parser HTML piuttosto che una semplice regex. E in realtà sono d'accordo con loro, ma se vuoi davvero usare s /// allora buttati fuori ;-) –
Questi sono tutti rotti.Prova a evidenziare "foo" in "foo foo blabla foo \ n fooo" –
vladr
Reinventare la ruota è così divertente! – jrockway