Dizedeki ascii olmayan karakteri kaldır


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

ve ascii olmayan tüm karakterleri dizeden kaldırmam gerekiyor,

str yalnızca "INFO] (Higashikurume)" içerdiği anlamına gelir;

Yanıtlar:


234

ASCII, 0 ila 127 aralığındadır, bu nedenle:

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

8
@AlexanderMills Bir ascii tablosu arayın - sadece sıfırdan 127'ye kadar değere sahip karakterlerin geçerli olduğunu görebilirsiniz. (0x7F, onaltılık olarak 127'dir). Bu kod, ascii aralığında olmayan tüm karakterlerle eşleşir ve onları kaldırır.
Zaffy

paylaşım için teşekkürler. \ X7F'nin nasıl çalıştığını açıklayabilir misiniz? Tekrar teşekkürler.
eyyo

1
@eyyo IIt son karakter olan ascii karakterini temsil eder. Böyle bir yorumda size tam bir açıklama yapamam. Buna onaltılık kaçış dizisi denir, eğer onu ararsanız, kesinlikle onun hakkında tonlarca bilgi bulacaksınız.
Zaffy

32

Olumlu bir kaldırma iddiasıyla da yapılabilir, örneğin:

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

Bu, unicode kullanır. Javascript'te, normal bir ifade için unicode ifade edilirken, karakterler kaçış dizisiyle belirtilir \u{xxxx}ancak bayrak da 'u'mevcut olmalıdır; normal ifadenin bayrakları olduğunu unutmayın 'gu'.

Buna "pozitif" bir iddia hangi karakterlerin kaldırılacağını ifade ederken "negatif" bir iddia hangi harflerin kaldırılmayacağını ifade etmesi anlamında "olumlu bir kaldırma iddiası" olarak adlandırdım. Birçok bağlamda, önceki cevaplarda belirtildiği gibi, olumsuz iddia okuyucu için daha anlamlı olabilir. Sirkumfleks " ^" "hayır" \x00-\x7Fdiyor ve aralık "ascii" diyor, bu nedenle ikisi birlikte "ascii değil" diyor.

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

Bu, yalnızca İngilizceyi önemseyen İngilizce konuşanlar için harika bir çözüm ve aynı zamanda orijinal soru için güzel bir yanıt. Ancak daha genel bir bağlamda, "ascii olmayan her şeyin kötü olduğunu" varsaymanın kültürel önyargısı her zaman kabul edilemez. Non-ascii'nin kullanıldığı, ancak ara sıra çıkarılması gereken bağlamlar için, Unicode'un olumlu iddiası daha uygun olur.

Sıfır genişlikli, yazdırılmayan karakterlerin bir dizeye gömülü olduğunun iyi bir göstergesi, dizenin "length" özelliğinin pozitif (sıfır olmayan) olduğu, ancak boş bir dizge gibi göründüğü (yani yazdırıldığı) durumdur. Örneğin, bunu Chrome hata ayıklayıcısında "textContent" adlı bir değişken için gösterdim:

> textContent
""
> textContent.length
7

Bu, o dizede ne olduğunu görmek istememe neden oldu.

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

Bu bayt dizisi, kelime işlemciler tarafından belgelere eklenen ve daha sonra veri alanlarına giren bazı Unicode karakterleri ailesinde görünüyor. En yaygın olarak, bu semboller bir belgenin sonunda bulunur. Sıfır genişlik alanı "%E2%80%8B"CK-Editor (CKEditor) tarafından eklenebilir.

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

Bunlarla ilgili bazı referanslar:

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

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

Gömülü karakterin kodlaması UTF-8 olmasına rağmen, normal ifadedeki kodlamanın olmadığını unutmayın. Karakter dizeye UTF-8'in üç baytı (benim durumumda) olarak gömülmüş olsa da, normal ifadedeki talimatlar iki baytlık Unicode kullanmalıdır. Aslında UTF-8 dört bayta kadar uzunlukta olabilir; Standart ascii kodlamasından kaçmak için yüksek bit (veya bit) kullandığından, Unicode'dan daha az kompakttır. Burada açıklanmıştır:

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


3
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");IE'de çalışmıyor (en azından IE 11). Hata vererek başarısız oluyor: SCRIPT5021 : Karakter kümesinde geçersiz aralık
Andrey Sorich

14

ASCII olmayan karakterleri değiştirmek için aşağıdaki normal ifadeyi kullanabilirsiniz

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

Bununla birlikte, boşlukların, iki nokta üst üste ve virgüllerin tümünün geçerli ASCII olduğunu, dolayısıyla sonucun

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

Normal ifadede pek iyi değilim ama .replace () yönteminin değiştirmek istediğiniz şeyi aldığını ve 2. parametreyi .replace gibi ('bu metni değiştirin', 'bu metinle') değiştirdiğini biliyorum. Öyleyse, bunun hangi kısmı tam tersini yapın ve ascii karakterlerini bırakın ve diğerlerini kaldırın. Teşekkürler.
NicoM

2
@NicoM Karakterler []herhangi bir karakteri [^]ifade eder, ancak tam tersi anlamındadır - parantez içinde olmayan herhangi bir karakterle eşleşir.
Zaffy

11

Bu yanıtların hiçbiri sekmeleri, satırsonlarını, satır başlarını doğru şekilde işlemez ve bazıları genişletilmiş ASCII ve unicode'u işlemez. Bu sekmeleri ve satırsonlarını SAKLAYACAK, ancak kontrol karakterlerini ve ASCII kümesinin dışındaki her şeyi kaldıracaktır. Test etmek için "Bu kod parçacığını çalıştır" düğmesini tıklayın. Yeni bir javascript geliyor, bu yüzden gelecekte (2020+?) Bunu yapmanız gerekebilir \u{FFFFF}ama henüz değil

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


iyi bir normal ifadedir, ancak aynı zamanda aksanları ve emojileri de kaldırır. Bu normal ifadeyi bu durumları kapsayacak şekilde nasıl geliştireceğinden emin değilim.
Julio Vedovatto

Angular window.atob ve DOMSanitizer.bypassSecurity'i kaldırmak için olası bir çözüm arayanlar için ... base64'e dönüştürürken geçersiz karakterler (% 80, \ uFFFF veya açıklanamayan beyaz boşluklar), bu çalışan bir çözümdür
B. León

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.