Wie die Flucht HTML
Ich habe einen string, der HTML-text enthält. Ich brauche zu entkommen, nur die Saiten und nicht Ihrer tags.
Ich habe zum Beispiel string enthält,
<ul class="main_nav">
<li>
<a class="className1" id="idValue1" tabindex="2">Test & Sample</a>
</li>
<li>
<a class="className2" id="idValue2" tabindex="2">Test & Sample2</a>
</li>
</ul>
Wie zu entkommen, nur auf den text an,
<ul class="main_nav">
<li>
<a class="className1" id="idValue1" tabindex="2">Test & Sample</a>
</li>
<li>
<a class="className2" id="idValue2" tabindex="2">Test & Sample2</a>
</li>
</ul>
mit heraus ändern der tags.
Können diese behandelt werden mit HTML-DOM-und javascript?
- wie sind die Saiten erzeugt?
- Kann man die
.innerText
Ihrer Anker - ich denke, naughty Zeichen werden escaped.
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Siehe weiter unten für eine Antwort auf die Frage, wie aktualisiert von Kommentaren aus dem OP unten)
Nein, sobald der text in das DOM, das Konzept von "Flucht" es gilt nicht. Die HTML - Quelle text muss maskiert werden, so dass es geparst wird, in die DOM richtig; sobald es in den DOM, er ist nicht entkommen.
Dies kann ein bisschen schwierig zu verstehen, also lassen Sie ' s verwenden ein Beispiel. Hier einige HTML - Quelle text (wie in einer HTML-Datei, die Sie würde die Ansicht im browser):
Wenn das einmal analysiert, in den DOM durch den browser, wird der text innerhalb der div ist
This & That
, weil die&
interpretiert worden ist, an diesem Punkt.So müssen Sie erwischen, früher, bevor der text analysiert wird, in den DOM durch den browser. Sie können nicht damit umgehen, dass es nach der Tat, es ist zu spät.
Getrennt, der string, den Sie sind, beginnend mit ungültig ist, wenn es Dinge wie
<div>This & That</div>
in es. Pre-processing, die ungültige Zeichenfolge wird schwierig sein. Sie können nicht nur integrierte Funktionen Ihrer Umgebung (PHP oder was auch immer Sie verwenden server-side), weil Sie die Flucht der tags. Sie benötigen text-Verarbeitung, - Extraktion nur die Teile, die Sie Bearbeiten möchten, und dann die Ausführung dieser durch fortlaufenden Prozess. Dieser Prozess wird schwierig sein. Ein&
gefolgt von Leerzeichen ist einfach genug, aber wenn es nicht korrekt codierten entities in den Quelltext, wie Sie wissen, ob Ihnen zu entkommen oder nicht? Gehen Sie davon aus, dass, wenn die Zeichenfolge enthält&
lassen Sie es allein? Oder verwandeln Sie es in&amp;
? (Das ist durchaus gültig; es wird zeigen, wie Sie die tatsächliche Zeichenfolge&
in einer HTML-Seite.)Was Sie wirklich tun müssen, ist, die zugrunde liegende problem: die Sache, Die die Erstellung dieser ungültig, halb-kodierte strings.
Bearbeiten: Aus unserer Kommentar-stream unter, die Frage ist ganz anders, als es schien, aus deinem Beispiel (das ist nicht kritisch gemeint). Zur Erinnerung die Kommentare für diejenigen, die zu dieser frische, Sie sagte, dass Sie immer waren diese strings von WebKit ist
innerHTML
, und ich sagte, das sei sonderbar,innerHTML
sollte codieren&
richtig (und wies Sie an ein paar von test Seiten, die es vorgeschlagen hast). Ihre Antwort war:Dass änderungen der Art der Frage. Sie wollen Personen aus Zeichen, die, während vollkommen gültig, wenn Sie wörtlich (vorausgesetzt, Sie haben Ihren text encoding rechts), könnten ausgedrückt werden als Entitäten statt und ist somit widerstandsfähiger zu-text-Codierung ändert.
Können wir das tun. Nach die Skillung, die Charakter-Werte in einem JavaScript-string sind UTF-16 (mit Unicode In Der Normalisierten Form C) und der Konvertierung von der Quelle-character encoding (ISO 8859-1, Windows-1252, UTF-8, was auch immer) durchgeführt wird, bevor der JavaScript-Laufzeit sieht. (Wenn Sie nicht zu 100% sicher, dass Sie wissen was ich meine character-encoding, es ist es Wert zu stoppen, jetzt, Los und Lesen Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) von Joel Spolsky, dann kommt zurück.) Das ist also der input-Seite. Auf der output-Seite, HTML-Entitäten identifizieren, die Unicode-code-points. So können wir umwandeln von JavaScript-strings in HTML-Entitäten zuverlässig.
Steckt der Teufel im detail, obwohl, wie immer. JavaScript explizit davon ausgegangen, dass jeder 16-bit-Wert eines Zeichens (siehe Abschnitt 8.4 in der spec), auch wenn das nicht wirklich wahr ist UTF-16 — ein 16-bit-Wert könnte ein "Ersatz" (wie 0xD800) das macht nur Sinn, wenn Sie kombiniert werden mit dem nächsten Wert, was bedeutet, dass zwei "Zeichen" in der JavaScript-string sind tatsächlich ein Zeichen. Dies ist nicht ungewöhnlich für fernöstliche Sprachen.
So ein robuste Konvertierung, beginnt mit einem JavaScript-string und die Ergebnisse in eine HTML-Entität kann nicht davon ausgehen, dass ein JavaScript - "Charakter" eigentlich gleich ein Zeichen im text, es zu handhaben Surrogate. Glücklicherweise, dies ist also tot einfach, weil die intelligenten Menschen definieren von Unicode-vorgenommen, es ganz einfach: Der erste Surrogat-Wert ist immer im Bereich 0xD800-0xDBFF (inklusive), und das zweite Surrogat ist immer im Bereich 0xDC00-0xDFFF (inklusive). Also jedes mal, wenn Sie sehen, ein paar "Zeichen" in einem JavaScript-string, entsprechen diese Bereiche, die Sie beschäftigen sich mit einem einzelnen Charakter, definiert durch ein ersatzpaar. Die Formeln für die Umwandlung von dem paar von Surrogat-Werte, um einen code-point-Wert, sind in der obigen links, und obwohl es ziemlich obtusely; ich finde auf dieser Seite viel mehr ansprechbar.
Bewaffnet mit all diesen Informationen, können wir eine Funktion schreiben, die wird nehmen Sie einen JavaScript-string und die Suche nach Zeichen (echte Charaktere, die vielleicht ein oder zwei "Zeichen" lange), wollen Sie vielleicht wiederum in Einheiten, ersetzt Sie mit named-entities aus einer Karte oder numerische Entitäten, wenn wir haben Sie nicht in unserem Namen anzeigen:
Sollten Sie fein sein, indem alle von den HTML durch, da dann, wenn diese Zeichen erscheinen in der Attribut-Werten, sind Sie fast sicher verschlüsseln will Sie es auch.
Habe ich nicht verwendet, die oben in der Produktion (ich schrieb sogar es für diese Antwort, weil das problem hat mich fasziniert) und es ist völlig geliefert, ohne Garantie jeglicher Art. Ich habe versucht, um sicherzustellen, dass es behandelt surrogate-Paare, denn das ist notwendig für fernöstliche Sprachen, und Sie zu unterstützen, ist etwas, was wir alle jetzt tun, die Welt ist kleiner geworden.
Komplette Beispiel-Seite:
Dort habe ich die Cedille als ein Beispiel von der Umwandlung in eine numerische Entität anstatt eines namens ein (da ich Links
cedil
aus meinem sehr kleinen Beispiel anzeigen). Und beachten Sie, dass der surrogate-pair-Mädchen am Ende zeigt sich in der ersten Warnung als zwei "Zeichen", weil der Weg von JavaScript verarbeitet UTF-16.innerHTML
oderouterHTML
man die Saiten von WebKit, sollten Sie bereits maskiert werden. Dieser test-Seite (pastie.org/1005105) erzeugt das erwartete Ergebnis in Chrome und Safari (WebKit-basierten Browsern). Auch wenn ich Ihnen ein ungültiges HTML-Datei mit&
statt&
(pastie.org/1005109) korrigieren Sie diese bei der Analyse und geben Sie mir die entity-version bei der Neueinrichtung der HTML-Code fürinnerHTML
undouterHTML
.innerHTML
, es tut seinen job. Sie versuchen, die Organisationen der absolut gültigen Zeichen. Siehe mein update für mehr. (innerHTML
undouterHTML
wurden Hinzugefügt, um die neueste HTML-Spezifikation, btw: w3.org/TR/html5/dom.html#htmlelement)Ich bin sehr überrascht, niemand antwortete dieser. Sie können einfach den browser nutzen, es selbst zu tun, die die Flucht für Sie. Keine regex ist besser oder sicherer als andere browser tun, was Sie am besten, handle HTML.
oder eine kurze alternative mit dem (Option) Konstruktor
Kodieren Sie alle Zeichen in der Zeichenfolge:
Oder nur den Gegner der Hauptfiguren zu kümmern (&, inebreaks, <, >, " und ') wie:
JS:
HTML:
Was server-side-Sprache verwenden Sie?
wenn Sie mit PHP, die Sie verwenden konnten htmlentities
Beispiel:
javascript
. Es gibt keine Anzeichen dafür, dass auf jedem server-side-Sprache ist auf allen beteiligten.Haben Sie versucht, die Funktion escape() in Javascript? JavaScript escape () - Funktion