2014-10-20 13 views
7

Staram się rozebrać wszystkie znaki z ciągu znaków z ciągu, z wyjątkiem:Wyrażenia regularne dla różnych punktów Unicode PHP

  • znaków alfanumerycznych
  • Znak dolara ($)
  • podkreślenia (_)
  • znaków Unicode pomiędzy punktami kodowymi U+0080 i U+FFFF

mam pierwsze trzy warunki, których autorem jest ten sposób:

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

Jak mogę iść o dopasowanie czwarty warunek? I looked at using \X, ale musi istnieć lepszy sposób niż wyliczanie 65 000 znaków.

Odpowiedz

15

Można użyć:

$foo = preg_replace('/[^\w$\x{0080}-\x{FFFF}]+/u', '', $foo); 
  • \w - jest odpowiednikiem [a-zA-Z0-9_]
  • \x{0080}-\x{FFFF} dopasować znaki pomiędzy punktami kodowymi U +0080 and U + FFFF`
  • /u wsparcie Unicode w regex
+0

Tak, niektóre exa Mats sprawi, że będzie to bardziej zrozumiałe z OP Wierzę, że – anubhava

+1

Początkowo zawahałem się na '\ w', ponieważ nie byłem pewien, czy dopasowanie zależne od ustawień lokalnych wpłynie na rzeczy, ale wygląda na to, że zakres Unicode obejmuje akcentowane znaki, więc sądzę, że jest bezpieczny . "/ U" jest tym, czego szukam, dzięki. Na marginesie, jaki jest samotny surogat? –

+1

@ rink.attendant.6: Istnieje zakres od 'd800' do' dfff' w celu określenia surogatów w UTF-16, aby umożliwić podanie większej liczby znaków. Pojedynczy surogat nie jest poprawnym znakiem w UTF-16 (para jest konieczna do określenia poprawnego znaku). Nie mogę sobie przypomnieć, czy PCRE zgłasza błąd, jeśli napotka na samotnego surogata w ciągu znaków. – nhahtdh

Powiązane problemy