2009-08-04 17 views
5

Ich benutze Javascript, um den Wert einer Eingabe mit Text, der HTML-spezifische Zeichen wie &  usw. enthalten kann. So, ich versuche, eine Regex zu finden, die diese Werte übereinstimmen und Ersetzen Sie sie durch den entsprechenden Wert ("&", " "), nur ich kann den Regex nicht herausfinden, um es zu tun. Hier ist, was ich versuche zu tun. Machen Sie ein Objekt das die Spiele und die Bezugnahme auf den Wiederbeschaffungswert enthält:JavaScript regex ersetzen html Zeichen

 
var specialChars = { 
    " " : " ", 
    "&" : "&", 
    ">" : ">", 
    "&lt;" : "<" 
} 

Dann will ich meinen String passen

 
var stringToMatch = "This string has special chars &amp; and &nbsp;" 

Ich habe versucht, so etwas wie

 
stringToMatch.replace(/(&nbsp;|&)/g,specialChars["$1"}); 

aber es funktioniert nicht. Ich verstehe nicht wirklich, wie man das spezielle Tag fängt und ersetzt. Jede Hilfe wird sehr geschätzt.

+0

Vielleicht "& nbsp;" wird Ihre   zeigen? – lance

+0

Warum nicht entkommen? http://www.w3schools.com/jsref/jsref_escape.asp – Joel

+0

Escape würde & in% 26amp% 3B drehen. Definitiv nicht das, was ich suche – brad

Antwort

15

Ich denke, Sie können die Funktionen aus einer Frage zu einem etwas anderen Thema (Efficiently replace all accented characters in a string?) verwenden.

Jason Bunting Antwort hat einige nette Ideen + die notwendige Erklärung, hier ist seine Lösung mit einigen Modifikationen an Sie beginnen (wenn Sie dies hilfreich, upvote seine ursprüngliche Antwort auch, da dieser seinen Code ist im Wesentlichen).

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g, 
     translate = { 
      'nbsp': String.fromCharCode(160), 
      'amp' : '&', 
      'quot': '"', 
      'lt' : '<', 
      'gt' : '>' 
     }, 
     translator = function($0, $1) { 
      return translate[$1]; 
     }; 

    return function(s) { 
     return s.replace(translate_re, translator); 
    }; 
})(); 

aufrufbar als

var stringToMatch = "This string has special chars &amp; and &amp;nbsp;"; 
var stringOutput = replaceHtmlEntites(stringToMatch); 

Nummerierte entites noch einfacher sind, können Sie sie viel mehr ersetzen allgemein ein wenig Mathematik und String.fromCharCode() verwenden.


Ein andere, viel einfachere Möglichkeit so sein würde (funktioniert in jedem Browser)

function replaceHtmlEntites(string) { 
    var div = document.createElement("div"); 
    div.innerHTML = string; 
    return div.textContent || div.innerText; 
} 

replaceHtmlEntites("This string has special chars &lt; &amp; &gt;"); 
// -> "This string has special chars < & >" 
+0

Also anscheinend verstehe ich Regex nicht.Ihr Code sah ziemlich gut zu mir, aber der Wert (s) in der Funktion tatsächlich enthält das ganze   Nicht nur die nbsp.Ich dachte, dass die Klammern nur übereinstimmen sollten die inneren Zeichen? Wie auch immer, das Modding, das das Objekt übersetzt, um das ganze " ", "&" usw. zu enthalten, arbeitete sonst. es kehrte gerade undefined zurück. Thanks – brad

+0

Die Antwort wurde ein wenig modifiziert, um dies zu berücksichtigen. Ich schätze, du hast es mit dem Originalcode versucht. Das obige funktioniert für mich, ich habe es gerade (wieder) ausprobiert. – Tomalak

+0

Wirklich? Nein, ich habe Ihren Code kopiert und den Debugger durchlaufen. Der Wert für mich wurde übergeben (s) war das ganze  . Sehr komisch. Ich benutze Safari und ich habe in Firefox getestet. Ich werde ein paar andere Browser auch versuchen. ANyway danke nochmal – brad

1

Sie können eine Funktion basierend Ersatz verwenden zu tun, was Sie tun möchten:

var myString = '&'+'nbsp;&'+'nbsp;&tab;&copy;'; 
myString.replace(/&\w+?;/g, function(e) { 
    switch(e) { 
     case '&nbsp;': 
      return ' '; 
     case '&tab;': 
      return '\t'; 
     case '&copy;': 
      return String.fromCharCode(169); 
     default: 
      return e; 
    } 
}); 

Aber ich Sie drängen Ihre Situation zu berücksichtigen. Wenn Sie & nbsp erhalten; und & Kopie; und andere HTML-Entitäten in Ihren Textwerten, möchten Sie sie wirklich ersetzen? Solltest du sie später konvertieren?

Nur etwas zu beachten.

Prost!

+1

Dies ist viel einfacher als die oben angenommene Antwort.Auch glaube ich, es wird besser skalieren, wie mehr Entitäten zur Liste hinzugefügt werden, was wichtig ist, da die Liste der benannten Entitäten SUPER lang ist. Du hast ausgeraubt Sohn! – Toby

+1

Ich bin nicht für die Punkte drin.Ich bin drin für die Fragen.Aber danke für die Stimmung. :) Es gibt auch die Tatsache, dass die Standard-Fall sollte Return e, nicht Wrapping – coderjoe

2

andere Möglichkeit, ein div-Objekt erstellen

var tmp = document.createElement("div"); 

dann den Text zuweisen würde sein innerHTML

tmp.innerHTML = mySpecialString; 

Und schließlich liest den Textinhalt des Elements

var output = tmp.textContent || tmp.innerText //for IE compatibility 

Und los geht ...

+0

Ich verwende den Text, um einen Wert einer Eingabe (w/jquery) zu setzen, so $ (Eingabe) .val (someText) es ist der someText, der den Ersatz benötigt – brad

+0

Okay, ich habe den Punkt. Wenn Sie das tun, was ich vorgeschlagen habe, werden alle Werte von der HTML-Engine des Browsers konvertiert, da die Eigenschaft "textContent" oder "innerText" den "resultierenden Text" enthält. – BYK

Verwandte Themen