4 Stimmen

Umwandlung von > in das HTML-Entity-Äquivalent im HTML-String

Ich versuche, alle Instanzen des Zeichens > in sein HTML-Entity-Äquivalent, >, innerhalb einer HTML-Zeichenkette, die HTML-Tags enthält, zu konvertieren. Am weitesten bin ich mit einer Lösung für dieses Problem gekommen, indem ich eine Regex verwendet habe.

Hier ist, was ich bis jetzt habe:

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

Das Hauptproblem, das ich habe, ist die Isolierung der einzelnen > Zeichen, die nicht Teil eines HTML-Tags sind. Ich möchte keine vorhandenen Tags konvertieren, da ich den HTML-Code zum Rendern beibehalten muss. Wenn ich die > Zeichen nicht konvertiere, erhalte ich fehlerhaftes HTML, was zu Darstellungsproblemen im Browser führt.

Dies ist ein Beispiel für eine zu analysierende Testzeichenfolge:

"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>"

In der obigen Zeichenfolge sollte keines der > Zeichen, die Teil von HTML-Tags sind, in > umgewandelt werden. Also, dies:

<div class"quotedReply">>

sollte dies werden:

<div class"quotedReply">&gt;

Ein weiteres Problem ist, dass der Ausdruck oben eine nicht-erfassende Gruppe verwendet, was in Ordnung ist, außer der Tatsache, dass die Übereinstimmung in Gruppe 1 ist. Ich bin nicht ganz sicher, wie man eine Ersetzung nur auf Gruppe 1 zu tun und den Rest der Übereinstimmung zu erhalten. Es scheint, dass ein MatchEvaluator nicht wirklich den Trick tun, oder vielleicht kann ich einfach nicht vorstellen, es gerade jetzt.

Ich vermute, meine Regex könnte etwas Liebe gebrauchen.

Hat jemand eine gute Idee?

4voto

AnthonyWJones Punkte 182582

Warum wollen Sie das tun? Welchen Schaden richten die > an? Die meisten Parser, denen ich begegnet bin, sind mit einer > eigenständigen Entität zufrieden, ohne dass sie in eine Entität überführt werden muss.

Darüber hinaus wäre es sinnvoller, die Content-Strings mit HtmlUtilty.HtmlEncode zu kodieren, bevor sie mit Strings, die HTML-Markup enthalten, verkettet werden. Wenn Sie die Kontrolle darüber haben, sollten Sie daher überlegen, wie Sie damit umgehen.

3voto

Alan Moore Punkte 70949

Der Trick besteht darin, alles zu erfassen, was ist nicht das Ziel und fügen Sie es dann zusammen mit dem geänderten Text wieder ein, etwa so:

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

Aber Anthony hat recht: rechteckige Klammern in Textknoten sollten keine Probleme verursachen. Und der Abgleich von HTML mit Regexen ist knifflig. Kommentare und CDATA können zum Beispiel praktisch alles enthalten, so dass ein robuster Regex sie speziell abgleichen müsste.

1voto

Jeff.Crossett Punkte 307

Vielleicht lesen Sie Ihr HTML in einen XML-Parser ein, der die Konvertierung für Sie übernehmen sollte.

0voto

LarryF Punkte 4745

Meinen Sie die > Zeichen innerhalb eines HTML-Tags (wie in Java's innerText) oder in der Argumentenliste eines HTML-Tags?

Wenn Sie nur den Text zwischen dem öffnenden und dem schließenden Tag bereinigen wollen, sollte das recht einfach sein. Suchen Sie einfach ein beliebiges > Zeichen und ersetzen Sie es durch das > ; (ich würde es auch mit dem <-Tag machen), aber die HTML-Rendering-Engine MUSS das für Sie erledigen...

Nennen Sie ein Beispiel für das, was Sie zu reinigen versuchen, und vielleicht finden wir die beste Lösung dafür.

Larry

0voto

JB King Punkte 11972

Könnten Sie die Zeichenkette in ein XML-Dokument einlesen, sich die Werte ansehen und die > con &gt; in den Werten. Dazu müsste man rekursiv in jeden Knoten des Dokuments gehen, aber das sollte nicht allzu schwierig sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X