2009-08-04 3 views
3

Ich bin auf der Suche nach dem besten Weg, um eine Art von "Smart" HTML-Codierung. Zum Beispiel:Smart HTML-Codierung

From: <a>Next >></a> to: <a>Next gt;gt;</a> 
From: <p><a><b><< Prev</b></a><br/><a>Next >></a></p> to: <p><a><b>&lt;&lt; Prev</b></a><br/><a>Next gt;gt;</a></p> 

Also nur die nicht XML/HTML-Teil des Textes codiert werden würde, als ob Htmlencode genannt wird.

Irgendwelche Vorschläge?

EDIT: Dies sollte so leicht wie möglich sein. Der eingehende Text stammt von Benutzern, die keine HTML-Codierung kennen.

+2

Smart würde sein "HTML schreiben" oder "Nur Text schreiben" - heuristisch zu bestimmen, welche Teile eines Strings HTML sind und welche sind Text, der Zeichen verwendet, die eine besondere Bedeutung in HTML haben * hard * (und wahrscheinlich unmöglich mit 100% Zuverlässigkeit zu tun haben). – Quentin

+0

Ja, ich bin nicht auf der Suche nach einer perfekten Lösung. Die Sache ist, dass Benutzer die Möglichkeit haben, etwas Text mit HTML-Tags einzufügen. Aber sie werden verwendet, um Dinge einzufügen, die nicht HTML sind, wie >>. Also muss ich versuchen, sicherzustellen, dass der endgültige Inhalt in Ordnung ist. Es ist sehr schwer, den Benutzern zu erklären, dass sie stattdessen > und < verwenden sollten. – Drejc

Antwort

-4

Ich würde wahrscheinlich versuchen, einen guten regulären Ausdruck dafür zu schreiben. Machst du das in Code hinter (C#) oder auf Client-Seite mit JavaScript?

http://www.regular-expressions.info/

+0

Der Versuch, reguläre Ausdrücke zu verwenden, um nicht-reguläre Daten zu analysieren, ist nicht der beste Weg, dies zu umgehen. Der beste Weg wäre, das DOM direkt zu manipulieren, was bereits erwähnt wurde. – Xetius

6

Ja: nicht jemals schreiben HTML in den Quelltext. Stattdessen arbeiten Sie mit einer API wie DOM, die sich um alle Kodierungsprobleme kümmert.

+0

Natürlich, wenn dieser Inhalt bereits existiert und Sie den Generator nicht ändern können, dann bleibt Ihnen der Versuch, den Inhalt selbst zu manipulieren. Vielleicht möchten Sie eine Form des lexikalischen Parsens ausprobieren. Versuchen Sie dies auf keinen Fall mit regulären Ausdrücken. Zumindest nicht, wenn Sie Ihren Verstand bewahren wollen. – Xetius

2

Wenn Sie eine solide und absolut zuverlässige C# -Lösung (aber schwer) wollen, dann würde ich die HTML Agility Pack library verwenden. Sie könnten dann Knoten durchlaufen und den Inhalt durch HTML kodieren. Es ist etwas kugelsicherer als reguläre Ausdrücke, aber offensichtlich intensiver.

Wenn Sie es clientseitig machen möchten, verwenden Sie JQuery. Siehe Encode HTML entities with jQuery.

0

Sie versuchen wahrscheinlich, das falsche Problem zu lösen. (Ich weiß, das ist nicht das, was Sie hören wollen.)

Wenn ein Benutzer nutzen darf nicht codierten >> und << in HTML schreiben, dann vermutlich würden sie auch in der Lage sein <> oder <b> zu schreiben, und in diesem Fall gibt es keine Möglichkeit, Sie können zuverlässig zwischen Text und Markup unterscheiden. (Vergessen Sie nicht, dass dies für XSS-Angriffe anfällig ist.)

Sie müssen wirklich den Text abfangen und codieren vor es wird in HTML interpoliert. Wahrscheinlich sollten Sie den Workflow erklären, der zu Ihnen Problem führt. Es muss einen besseren Weg geben, es zu lösen.

Edit als Antwort auf Kommentar: Es gibt einfach keine Möglichkeit, Eingabe zuverlässig zu verschlüsseln, die Text oder HTML gleichzeitig sein kann. Jedenfalls, wenn Benutzer technisch genug sind, um Raw-HTML einzugeben, können sie vermutlich Entitäten schreiben - andernfalls sollte sie überhaupt nicht rohes HTML eingeben. Wenn die HTML-Eingabe nur für fortgeschrittene Benutzer gedacht ist, könnten Sie ein Kontrollkästchen haben, das angibt, ob die Eingabe Text oder HTML ist. Aber Sie sollten wahrscheinlich einen Rich-Text-Editor verwenden.

+0

Die Sache ist, ich habe eine Feature-Anfrage, um die Eingabe von HTML-Tags zu erlauben, um den Text zu formatieren. ABER zuvor war der Text immer codiert und Benutzer werden verwendet, um nicht-HTML-Text in die Felder zu schreiben. Jetzt weiß ich, dass es einige Inputs gibt, die ich als Beispiel gegeben habe. Um zu verhindern, dass es das XML bricht, suche ich nach einer Möglichkeit, es zu "reparieren". Das Abfangen der Eingabe ist keine Option, da ich keine Kontrolle darüber habe. – Drejc

+0

@Drejc: Sie sollten diese Informationen wahrscheinlich zur ursprünglichen Frage hinzufügen. – JacquesB

0

Haben Sie darüber nachgedacht, sauberes.net zu benutzen? Du könntest deine Benutzereingabe hineinwerfen und sehen, was es hervorbringt, es sehr, sehr, sehr gut und Müll in etwas verwandeln, das du wirklich willst. Es ist eine DLL und alle verwalteten Code glaube ich, so können Sie es einfach einschrauben.

Wie für die nicht zu regexp Band Wagon, stimme ich nicht zu. Wenn die Daten begrenzt sind (Sie sagen nicht, ob dies der Fall ist oder nicht), könnten Sie einige Regeln finden, um zumindest zu versuchen, Ihre Eingabe-Zeichenfolge zu validieren, wenn Sie sie nicht bereinigen. Ich vermute jedoch, dass Ihre Daten buchstäblich alles sein könnten, in welchem ​​Fall Sie besser etwas anderes verwenden sollten, aber es sollte nicht vollständig ausgeschlossen werden.