文字列内の非ASCII文字を削除します


89
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

文字列からASCII以外の文字をすべて削除する必要があります。

strには「INFO](東久留米)」のみが含まれていることを意味します。

回答:


229

ASCIIは0から127の範囲であるため、次のようになります。

str.replace(/[^\x00-\x7F]/g, "");

8
@AlexanderMillsASCIIテーブルを検索します-値が0から127の文字のみが有効であることがわかります。(0x7Fは16進数で127です)。このコードは、ASCII範囲にないすべての文字に一致し、それらを削除します。
ザフィー2017年

31

これは、次のように、削除を積極的に表明して行うこともできます。

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

これはユニコードを使用します。Javascriptでは、正規表現のUnicodeを表現する場合、文字はエスケープシーケンスで指定されます\u{xxxx}が、フラグも'u'存在する必要があります。正規表現にはフラグがあることに注意してください'gu'

「ポジティブ」アサーションは削除する文字を表し、「ネガティブ」アサーションは削除しない文字を表すという意味で、これを「ポジティブ削除アサーション」と呼びました。多くの場合、前の回答で述べたように、否定的な主張は読者にとってより示唆に富むかもしれません。曲折アクセント記号「^」は「not」と\x00-\x7F言い、範囲は「ascii」と言うので、2つは一緒に「notascii」と言います。

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

これは、英語だけを気にする英語を話す人にとっては素晴らしい解決策であり、元の質問に対する優れた答えでもあります。しかし、より一般的な文脈では、「すべての非アスキーは悪い」と仮定するという文化的偏見を常に受け​​入れることはできません。非ASCIIが使用されているが、場合によっては削除する必要があるコンテキストでは、Unicodeの肯定的なアサーションの方が適しています。

幅がゼロの非印刷文字が文字列に埋め込まれていることを示す良い兆候は、文字列の「長さ」プロパティが正(ゼロ以外)であるが、空の文字列のように見える(つまり、印刷される)場合です。たとえば、「textContent」という名前の変数について、これをChromeデバッガーに表示しました。

> textContent
""
> textContent.length
7

これにより、その文字列に何が含まれているかを確認したいと思いました。

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

このバイトシーケンスは、ワードプロセッサによってドキュメントに挿入され、データフィールドに入るUnicode文字のファミリのようです。最も一般的には、これらの記号はドキュメントの最後にあります。ゼロ幅スペース"%E2%80%8B"は、CK-Editor(CKEditor)によって挿入される場合があります。

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

それらに関するいくつかの参照:

http://www.fileformat.info/info/unicode/char/200B/index.htm

https://en.wikipedia.org/wiki/Left-to-right_mark

埋め込み文字のエンコードはUTF-8ですが、正規表現のエンコードはそうではないことに注意してください。文字はUTF-8の3バイト(私の場合)として文字列に埋め込まれていますが、正規表現の命令は2バイトのUnicodeを使用する必要があります。実際、UTF-8の長さは最大4バイトです。標準のASCIIエンコーディングをエスケープするために上位ビット(または複数のビット)を使用するため、Unicodeよりもコンパクトではありません。それはここで説明されています:

https://en.wikipedia.org/wiki/UTF-8


3
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");IE(少なくともIE 11)では機能しません。これは、エラーで失敗します。SCRIPT5021を文字セットに無効な範囲
アンドレイSorich

14

次の正規表現を使用して、非ASCII文字を置き換えることができます

str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

ただし、スペース、コロン、コンマはすべて有効なASCIIであるため、結果は次のようになります。

> str
"INFO] :, , ,  (Higashikurume)"

私は正規表現が得意ではありませんが、.replace()メソッドが置き換えたいものを受け取り、.replace( 'replace this text'、 'with this text')のような2番目のパラメーターを置き換えることを知っています。つまり、その一部が反対のことを行い、ASCII文字を残して、他の文字を削除します。ありがとう。
NicoM 2014年

2
@NicoMの文字は[]任意の文字を意味しますが、[^]その逆を意味します-括弧内にない任意の文字と一致します。
ザフィー2014

10

これらの回答はいずれも、タブ、改行、キャリッジリターンを適切に処理せず、拡張ASCIIとユニコードを処理しないものもあります。これにより、タブと改行は保持されますが、ASCIIセットから制御文字などが削除されます。[このコードスニペットを実行する]ボタンをクリックしてテストします。いくつかの新しいJavaScriptがパイプから出てくるので、将来(2020+?)にやらなければならないかもしれ\u{FFFFF}ませんが、まだです

console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))


良い正規表現ですが、アクセントや絵文字も削除されます。これらのケースをカバーするためにこの正規表現をどのように改善するかはわかりません。
Julio Vedovatto

角度window.atobとDOMSanitizer.bypassSecurity ...無効な文字を削除する可能性のある解決策を探している人のために(それを可能%80、\ uFFFFまたは原因不明の空白文字)をbase64に変換するとき、これはワーキングソリューションです
B.レオン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.