2014-10-20 18 views
7

ben hariç bir dizeden bir dize tüm karakterler şerit çalışıyorum:Düzenli ifadeler PHP

  • Alfanümerik karakterler
  • Dolar işareti ($)
  • çizgi (_) kod noktaları U+0080 ve U+FFFF
arasında
  • Unicode karakterleri Dördüncü koşul eşleşen konuda nasıl gidiyor

    preg_replace('/[^a-zA-Z\d$_]+/', '', $foo); 
    

    :

    Bunu yaparak ilk üç koşulu var? I looked at using \X ancak 65.000'den fazla karakteri listelemenin daha iyi bir yolu olmalı.

  • cevap

    15

    Sen kullanabilirsiniz:

    $foo = preg_replace('/[^\w$\x{0080}-\x{FFFF}]+/u', '', $foo); 
    
    • \w - regex unicode desteği için kod noktaları arasındaki karakterleri eşleştirmek için U + FFFF`
    • /u[a-zA-Z0-9_]
    • \x{0080}-\x{FFFF} eşdeğerdir
    +0

    Evet bazı exa mples OP'den daha açık olurum – anubhava

    +1

    inanıyorum Başlangıçta '\ w' diye tereddüt ettim çünkü yerel ayara özgü eşleşmenin şeyleri etkileyip etkilemeyeceğinden emin değildim ama bu Unicode aralığı aksanlı karakterleri her zaman kaplıyor gibi görünüyor. . Aradığım şey, teşekkürler. Bir yan notta, yalnız bir vekil nedir? –

    +1

    @ rink.attendant.6: Daha fazla karakterin belirtilmesine izin vermek için UTF-16'da vekiller belirtmek için 'd800' ile 'dfff' arasında bir aralık vardır. Tek bir vekil, UTF-16'da geçerli bir karakter değildir (geçerli bir karakter belirtmek için bir çift gereklidir). Yine de, PCRE, dizede yalnız bir vekil ile karşılaştığında bir hata atarsa, hatırlayamıyorum. – nhahtdh

    İlgili konular