Domanda

Sto cercando di scrivere un'espressione regolare per eliminare tutto l'HTML ad eccezione dei collegamenti (the <a href E </a> tag rispettivamente.Non deve essere sicuro al 100% (non sono preoccupato per attacchi injection o altro poiché sto analizzando contenuti che sono già stati approvati e pubblicati in un SWF film).

L'espressione regolare originale "strip tag" che sto utilizzando era <(.|\n)+?>, e ho provato a modificarlo in <([^a]|\n)+?>, ma ciò ovviamente consentirà a qualsiasi tag che abbia un'estensione UN in esso piuttosto che uno che ce l'ha all'inizio, con uno spazio.

Non che abbia molta importanza, ma nel caso qualcuno voglia saperlo, lo scrivo ActionScript 3.0 per un Veloce film.

È stato utile?

Soluzione

<(?!\/?a(?=>|\s.*>))\/?.*?>

Prova questo.Avevo qualcosa di simile per i tag p.Ha funzionato per loro quindi non vedo perché no.Utilizza lookahead negativo per verificare che non corrisponda a (con prefisso / opzionale) dove (usando lookahead positivo) a (con prefisso / opzionale) è seguito da > o uno spazio, roba e quindi >.Questo quindi corrisponde fino al carattere > successivo.Metti questo in un subst con

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;

Questo dovrebbe lasciare solo i tag di apertura e chiusura

Altri suggerimenti

Continuo a parlarne, ma non posso consigliarlo in alcun modo regexr troppo spesso.È fantastico per testare questo tipo di cose.

In generale ci sono problemi con questo approccio.Le espressioni regolari sono le migliori per corrispondenze di testo "piatte": i dati nidificati spingono i motori espressioni regolari in aree per le quali non sono progettati.L'analisi HTML generale richiede un parser e non un motore regex (Google per la differenza tra linguaggi normali e privi di contesto se desideri i dettagli tecnici completi).

È facile eliminare tutti i tag sostituendo /</ e />/ con la stringa vuota o i loro equivalenti di entità, ma filtrare selettivamente l'HTML utilizzando le espressioni regolari sarà vulnerabile a un'ampia gamma di input accidentali o dannosi che interrompono le cose.

Ecco qui:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}

Che ne dite di

<[^a](.|\n)+?>

?

strip_tags() fa questo.

Qui includo tutto <a><p><font><b><i><sup> tag e producendo una versione ordinata:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top