स्ट्रिंग में गैर-एससीआई चरित्र को हटा दें


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

और मुझे स्ट्रिंग से सभी गैर-एससीआई चरित्र को हटाने की आवश्यकता है,

इसका मतलब केवल str में "INFO] (हिगाशिकुरूम) है;"

जवाबों:


234

ASCII 0 से 127 की सीमा में है, इसलिए:

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

8
@AlexanderMills एक आस्की टेबल की खोज करें - आप देख सकते हैं कि केवल शून्य से 127 तक के मूल्य वाले वर्ण मान्य हैं। (0x7F हेक्स में 127 है)। यह कोड उन सभी वर्णों से मेल खाता है, जो अस्की रेंज में नहीं हैं और उन्हें हटा देता है।
ज़फी

साझा करने के लिए धन्यवाद। क्या आप यह बताना चाहेंगे कि कैसे काम करता है? एक बार फिर धन्यवाद।
आईआईयू

1
@eyyo IIt पिछले चरित्र ascii चरित्र का प्रतिनिधित्व करता है। मैं आपको इस तरह से एक टिप्पणी में पूर्ण विवरण नहीं दे सकता। इसे हेक्साडेसिमल एस्केप सीक्वेंस कहा जाता है, यदि आप इसे खोजते हैं, तो आप निश्चित रूप से इसके बारे में जानकारी प्राप्त करेंगे।
ज़फ्फी

32

इसे हटाने के सकारात्मक दावे के साथ भी किया जा सकता है:

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

यह यूनिकोड का उपयोग करता है। जावास्क्रिप्ट में, जब एक नियमित अभिव्यक्ति के लिए यूनिकोड व्यक्त किया जाता है, तो वर्णों को भागने के क्रम के साथ निर्दिष्ट किया जाता है, \u{xxxx}लेकिन झंडा भी 'u'मौजूद होना चाहिए; ध्यान दें कि रेग्ज में झंडे हैं 'gu'

मैंने इसे "निष्कासन का सकारात्मक अभिकथन" इस अर्थ में कहा कि एक "धनात्मक" अभिकथन व्यक्त करता है कि कौन से वर्णों को हटाना है, जबकि एक "नकारात्मक" अभिकथन को व्यक्त करता है कि कौन से अक्षरों को नहीं हटाना है। कई संदर्भों में, नकारात्मक अभिकथन, जैसा कि पूर्व उत्तरों में कहा गया है, पाठक के लिए अधिक विचारोत्तेजक हो सकता है। परिधि " ^" कहती है "नहीं" और सीमा \x00-\x7Fकहती है "अस्की," इसलिए दोनों एक साथ कहते हैं "अस्की नहीं।"

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

यह अंग्रेजी भाषा बोलने वालों के लिए एक बढ़िया समाधान है जो केवल अंग्रेजी भाषा की परवाह करते हैं, और इसका मूल प्रश्न के लिए एक अच्छा जवाब भी है। लेकिन एक अधिक सामान्य संदर्भ में, कोई भी यह मानने के सांस्कृतिक पूर्वाग्रह को स्वीकार नहीं कर सकता है कि "सभी गैर-अस्की बुरी है।" ऐसे संदर्भों के लिए जहां गैर-असिसी का उपयोग किया जाता है, लेकिन कभी-कभी इसे बाहर निकालने की आवश्यकता होती है, यूनिकोड का सकारात्मक जोर एक बेहतर फिट है।

एक अच्छा संकेत है कि शून्य-चौड़ाई, गैर मुद्रण वर्ण एक स्ट्रिंग में एम्बेडेड हैं, जब स्ट्रिंग की "लंबाई" संपत्ति सकारात्मक (नॉनज़रो) है, लेकिन ऐसा लगता है (जैसे कि प्रिंट) एक खाली स्ट्रिंग। उदाहरण के लिए, "टेक्स्ट कॉन्टेंट" नामक एक चर के लिए, मैंने क्रोम डीबगर में यह दिखाया था:

> 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"

बाइट्स का यह क्रम कुछ यूनिकोड वर्णों के परिवार में लगता है जो दस्तावेजों में वर्ड प्रोसेसर द्वारा डाले जाते हैं, और फिर डेटा फ़ील्ड में अपना रास्ता खोजते हैं। आमतौर पर, ये प्रतीक किसी दस्तावेज़ के अंत में होते हैं। शून्य-चौड़ाई-स्थान "%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 के तीन बाइट्स (मेरे मामले में) के रूप में स्ट्रिंग में एम्बेडेड है, नियमित अभिव्यक्ति में दिए गए निर्देशों में दो-बाइट यूनिकोड का उपयोग करना चाहिए। वास्तव में, UTF-8 चार बाइट्स तक लंबा हो सकता है; यह यूनिकोड की तुलना में कम कॉम्पैक्ट है क्योंकि यह मानक एससीआई एन्कोडिंग से बचने के लिए उच्च बिट (या बिट्स) का उपयोग करता है। यह यहाँ समझाया गया है:

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


3
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");IE (कम से कम IE 11) में काम नहीं करता है। यह त्रुटि के साथ विफल रहता है: SCRIPT5021 : चरित्र सेट में अमान्य श्रेणी
एंड्री सोरिच

14

आप गैर-ASCII वर्णों को बदलने के लिए निम्न regex का उपयोग कर सकते हैं

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

हालांकि, ध्यान दें कि रिक्त स्थान, कॉलोन और अल्पविराम सभी मान्य ASCII हैं, इसलिए परिणाम होगा

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

मैं रेगेक्स के साथ महान नहीं हूं, लेकिन (.replace) विधि जानती हूं कि आप जिस चीज को बदलना चाहते हैं, उसे 2nd पैरामीटर जैसे .replace ('इस पाठ को प्रतिस्थापित करें', 'इस पाठ के साथ') से प्रतिस्थापित करें। तो जो हिस्सा कहता है वह उसके विपरीत होता है और अस्की पात्रों को छोड़कर दूसरों को हटा देता है। धन्यवाद।
NicoM

2
@ NicoM वर्ण []किसी भी वर्ण में [^]होता है लेकिन विपरीत में - किसी भी वर्ण को कोष्ठक में नहीं मिलाता है ।
जफ्फी

11

इनमें से कोई भी जवाब ठीक से टैब, न्यूलाइन्स, कैरिज रिटर्न, और कुछ नहीं बढ़ाए गए ASCII और यूनिकोड को संभालते हैं। यह KEEP टैब और नई कथानक होगा, लेकिन ASCII सेट से नियंत्रण वर्ण और कुछ भी हटा देगा। परीक्षण करने के लिए "इस कोड स्निपेट को चलाएँ" बटन पर क्लिक करें। भविष्य में (2020+?) पाइप के नीचे कुछ नई जावास्क्रिप्ट आने वाली है, \u{FFFFF}लेकिन आपको अभी तक ऐसा नहीं करना है

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


यह एक अच्छा रेगेक्स है, लेकिन यह लहजे और इमोजी को भी हटा देता है। मुझे यकीन नहीं है कि इन मामलों को कवर करने के लिए इस रेगेक्स को कैसे सुधारें।
जूलियो वेदोवत्तो

किसी भी संभव उपाय के लिए कोणीय window.atob और DOMSanitizer.bypassSecurity ... अवैध वर्णों को हटाने के लिए देख रहे हैं ... अमान्य वर्ण (यह% 80, \ uFFFF या अस्पष्टीकृत व्हाट्सएप) जब base64 में परिवर्तित हो रहे हों, तो यह एक कार्यशील समाधान है
B. León

10

एक्सेंट के साथ ASCII का उपयोग करने के लिए:

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

प्रतिभाशाली! 127 से ऊपर के एएससीआई मूल्यों को संभालता है कि अन्य उत्तर दूर फेंक देते हैं।
user3413723

एक्सेंट के साथ ऑल्ट टेक्स्ट के बारे में कैसे ... जैसे altcodeunicode.com/alt-codes-letter-e-with-accents ?
स्टैकेडअप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.