2010-07-20 21 views

cevap

8

Sorunun bir kısmı, hedefi bir UTF-8 dizesi olarak ele almadığınız; Bunun için /u değiştiricisine ihtiyacınız var. Ayrıca, UTF-8'de, ASCII olmayan herhangi bir karakter, tümü \x80..\xFF aralığındaki iki veya daha fazla bayt tarafından temsil edilir. Bu deneyin:

preg_replace('/\p{Cc}+/u', '', $value) 

\p{Cc} kontrol karakterler için Unicode özelliktir ve u nedenleri hem düzenli ifade ve hedef dize UTF-8 olarak tedavi edilecek.

+0

Geçerli bir karakter, (örneğin, ąęćśńżź gibi) Polonyalı diactric karakterleri gibi ASCII aralığının dışında kalacak mı? Geçersiz UTF-8 sekanslarını kesecek düzenli bir ifadeyi arıyorum (bu yüzden MySQL böyle bir dizeyi veritabanına eklerken şikayet etmeyecektir), ancak her şeyi el değmemiş halde bırakın. – pako

+0

Bunun için '/ \ P {Any}/u'' kullanmak istediğinizi düşünüyorum -' Any 'kendini açıklayıcı olmalı ve '\ P {}' (büyük harf)' \ p {} '. Ama daha önce geçersiz bayt dizilerinin oraya nasıl girdiğiyle daha çok ilgilenirim. –

5

kullanabilirsiniz Unicode character properties

preg_replace('/[^\p{L}\s]/u','',$value); 

hiçbir fullproof ama bazı güzel çevirileri yolla sen, ASCII için Unicode dönmek isterseniz

(eğer içinden izin vermek istiyorum diğer sınıfları eklemek musunuz):

echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno' 
+0

NOT: Yukarıdaki URL bozuk ve SO cevabı düzenlememe izin vermiyor; Doğru URL: http://php.net/manual/en/regexp.reference.unicode.php – DOOManiac

+0

@DOOManiac: Tamam, işaretlediğiniz için teşekkürler, URL'yi düzeltin. – Wrikken

İlgili konular