Antworten:
ASCII liegt im Bereich von 0 bis 127, also:
str.replace(/[^\x00-\x7F]/g, "");
Dies kann auch mit einer positiven Behauptung der Entfernung erfolgen, wie folgt:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
Dies verwendet Unicode. In Javascript werden beim Ausdrücken von Unicode für einen regulären Ausdruck die Zeichen mit der Escape-Sequenz angegeben, \u{xxxx}
aber auch das Flag 'u'
muss vorhanden sein. Beachten Sie, dass der Regex Flags hat 'gu'
.
Ich nannte dies eine "positive Behauptung der Entfernung" in dem Sinne, dass eine "positive" Behauptung ausdrückt, welche Zeichen entfernt werden sollen, während eine "negative" Behauptung ausdrückt, welche Buchstaben nicht entfernt werden sollen. In vielen Zusammenhängen könnte die negative Behauptung, wie in den vorherigen Antworten angegeben, für den Leser suggestiver sein. Der Zirkumflex " ^
" sagt "nicht" und der Bereich \x00-\x7F
sagt "ascii", also sagen die beiden zusammen "nicht ascii".
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
Dies ist eine großartige Lösung für englischsprachige Personen, die sich nur für die englische Sprache interessieren, und eine gute Antwort auf die ursprüngliche Frage. In einem allgemeineren Kontext kann man jedoch nicht immer die kulturelle Tendenz akzeptieren, anzunehmen, dass "alle Nicht-ASCII schlecht sind". Für Kontexte, in denen Nicht-ASCII verwendet wird, aber gelegentlich entfernt werden müssen, ist die positive Behauptung von Unicode besser geeignet.
Ein guter Hinweis darauf, dass nicht druckbare Zeichen mit einer Breite von Null in eine Zeichenfolge eingebettet sind, ist, wenn die Eigenschaft "Länge" der Zeichenfolge positiv ist (ungleich Null), aber wie eine leere Zeichenfolge aussieht (dh als solche gedruckt wird). Zum Beispiel wurde dies im Chrome-Debugger für eine Variable mit dem Namen "textContent" angezeigt:
> textContent
""
> textContent.length
7
Dies veranlasste mich zu sehen, was in dieser Zeichenfolge war.
> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
Diese Folge von Bytes scheint zur Familie einiger Unicode-Zeichen zu gehören, die von Textverarbeitungsprogrammen in Dokumente eingefügt werden und dann in Datenfelder gelangen. Am häufigsten treten diese Symbole am Ende eines Dokuments auf. Der Raum mit der Breite Null "%E2%80%8B"
kann vom CK-Editor (CKEditor) eingefügt werden.
encodeURI() UTF-8 Unicode html Meaning
----------- -------- ------- ------- -------------------
"%E2%80%8B" EC 80 8B U 200B ​ zero-width-space
"%E2%80%8E" EC 80 8E U 200E ‎ left-to-right-mark
"%E2%80%8F" EC 80 8F U 200F ‏ right-to-left-mark
Einige Referenzen zu diesen:
http://www.fileformat.info/info/unicode/char/200B/index.htm
https://en.wikipedia.org/wiki/Left-to-right_mark
Beachten Sie, dass die Codierung des eingebetteten Zeichens zwar UTF-8 ist, die Codierung im regulären Ausdruck jedoch nicht. Obwohl das Zeichen als drei Bytes (in meinem Fall) von UTF-8 in die Zeichenfolge eingebettet ist, müssen die Anweisungen im regulären Ausdruck den Zwei-Byte-Unicode verwenden. Tatsächlich kann UTF-8 bis zu vier Bytes lang sein. Es ist weniger kompakt als Unicode, da es das High-Bit (oder die High-Bits) verwendet, um der Standard-ASCII-Codierung zu entkommen. Das wird hier erklärt:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
funktioniert nicht im IE (mindestens IE 11). Es schlägt mit Fehler fehl: SCRIPT5021 : Ungültiger Bereich im Zeichensatz
Sie können den folgenden regulären Ausdruck verwenden, um Nicht-ASCII-Zeichen zu ersetzen
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
Beachten Sie jedoch, dass Leerzeichen, Doppelpunkte und Kommas alle gültige ASCII-Werte sind, sodass das Ergebnis angezeigt wird
> str
"INFO] :, , , (Higashikurume)"
[]
bedeuten jedes Zeichen, aber im [^]
Gegenteil - stimmen mit jedem Zeichen überein, das nicht in Klammern steht.
Keine dieser Antworten behandelt Tabulatoren, Zeilenumbrüche und Zeilenumbrüche ordnungsgemäß, und einige behandeln nicht erweitertes ASCII und Unicode. Dadurch werden Tabulatoren und Zeilenumbrüche beibehalten, aber Steuerzeichen und alles aus dem ASCII-Satz entfernt. Klicken Sie zum Testen auf die Schaltfläche "Code-Snippet ausführen". Es kommt ein neues Javascript auf den Markt, sodass Sie es in Zukunft (2020+?) Möglicherweise tun müssen, \u{FFFFF}
aber noch nicht
console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))
So verwenden Sie ASCII mit Akzenten:
var str = str.replace(/[^\x00-\xFF]/g, "");