Domanda

Sto cercando di convertire tutte le istanze del> carattere per la sua entità HTML equivalente,>, all'interno di una stringa di codice HTML che contiene i tag HTML. La più lontana Sono stato in grado di ottenere con una soluzione per questo sta usando un'espressione regolare.

Ecco quello che ho finora:

        public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline);

Il problema principale che sto avendo è isolare i singoli> caratteri che non fanno parte di un tag HTML. Non voglio convertire eventuali tag esistenti, perché ho bisogno di conservare il codice HTML per il rendering. Se non convertire i> personaggi, ottengo HTML malformato, che causa problemi di rendering nel browser.

Questo è un esempio di una stringa di prova per analizzare:

"Ok, now I've got the correct setting.<br/><br/>On 12/22/2008 3:45 PM, jproot@somedomain.com wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > sbartfast@somedomain.com wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>"

Nella stringa di cui sopra, nessuno dei> caratteri che fanno parte di tag HTML deve essere convertito in>. Quindi, in questo modo:

<div class"quotedReply">>

dovrebbe diventare questa:

<div class"quotedReply">&gt;

Un altro problema è che l'espressione utilizza un gruppo non-cattura, che va bene, tranne per il fatto che la partita è in gruppo 1. Io non sono del tutto sicuro di come fare di sopra di un solo sostituire il gruppo 1 e preservare la resto della partita. Sembra che un MatchEvaluator in realtà non fare il trucco, o forse non riesco proprio a immaginare in questo momento.

Ho il sospetto che il mio regex potrebbe fare con un po 'lovin'.

Qualcuno ha qualche idea brillante?

È stato utile?

Soluzione

Il trucco è quello di catturare tutto ciò che non il bersaglio, poi ricollegarlo insieme al testo modificato, in questo modo:

Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1&gt;");

Ma Anthony destra: le staffe ad angolo retto in nodi di testo non dovrebbe causare problemi. E la congruenza HTML con regex è difficile; per esempio, commenti e CDATA possono contenere praticamente qualsiasi cosa, quindi una regex robusto avrebbe dovuto corrispondere loro in particolare.

Altri suggerimenti

Perché vuoi fare questo? Che male sono i> facendo? La maggior parte dei parser che ho incontrato sono abbastanza felice con un> da solo senza bisogno di essere sfuggito a un soggetto.

Inoltre, sarebbe più appropriato per codificare correttamente le stringhe di contenuto con HtmlUtilty.HtmlEncode prima di concatenare con le stringhe contenenti codice HTML, quindi se questo è sotto il vostro controllo si dovrebbe considerare che fare con esso là.

Forse leggere il codice HTML in un parser XML che dovrebbe prendersi cura delle conversioni per voi.

Stai parlando i> caratteri all'interno di un tag HTML, (come in innerText di Java), o nella lista arguements di un tag HTML?

Se si vuole solo disinfettare il testo tra il tag di apertura e chiusura, che dovrebbe essere piuttosto semplice. Basta individuare qualsiasi> char, e sostituirlo con il >. (Mi piacerebbe anche farlo con il < tag), ma il motore di rendering HTML dovrebbe prendersi cura di questo per voi ...

Dare un esempio di ciò che si sta cercando di disinfettare, e forse abbiamo un trovare la migliore soluzione per esso.

Larry

Potrebbe leggere la stringa in un documento XML e guardare i valori e sostituire il > con &gt; nei valori. Ciò richiederebbe ricorsivamente andare in ogni nodo nel documento ma che non dovrebbe essere troppo difficile da fare.

Steve_C, si può provare questo RegEx. Questo darà la cattura qualsiasi tag HTML in riferimento 1, e il testo tra i tag è memorizzato nella cattura 2. Non ho prove pienamente questo, basta buttare là fuori nel caso in cui potrebbe essere utile.

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top