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:
ASCII, 0 ila 127 aralığındadır, bu nedenle:
str.replace(/[^\x00-\x7F]/g, "");
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-\x7F
diyor 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:
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
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)"
[]
herhangi bir karakteri [^]
ifade eder, ancak tam tersi anlamındadır - parantez içinde olmayan herhangi bir karakterle eşleşir.
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, ''))
ASCII'yi aksanlarla kullanmak için:
var str = str.replace(/[^\x00-\xFF]/g, "");