2013-05-24 17 views
9

Przeszukując również Internet i tę stronę, znalazłem kilka tematów na ten temat. Chodzi o to, że istnieją niezliczone rozwiązania, jeśli wstawione ciągi muszą zawierać tylko znaki alfabetu łacińskiego, ale gdy sprawa wymaga tekstu innych alfabetów, staje się to nieco trudne.PHP usuwa symbole ze stringów

Czy istnieje sposób, w jaki mogę usunąć w PHP wszystkie symbole z ciągu, ale pozostawić rzeczywiste litery wszystkich alfabetów UTF-8? Próbowałem już stworzyć tablicę wszystkich znaków mojej klawiatury, a następnie używając str_replace lub preg_replace je usunąć, ale potem odkryłem, że różne kraje mają również inne klawiatury, które czasami zawierają różne symbole. Na przykład moja klawiatura qwerty nie ma symbolu £, który może posiadać brytyjska klawiatura.

Wiem, że to dziwne pytanie, zastanawiam się tylko, czy istnieje proste rozwiązanie, które mogłem przegapić.

Każda pomoc będzie bardzo ceniona!

EDIT: OK Po jakiś lepszy i rozszerzone Google-ing I odkryli, że poniższe wyrażenie regularne działa poprawnie, co muszę i utrzymuje wszystkie litery alfabetu wszystkich typów jednocześnie usuwa wszystkie symbole. Dzielę się tym tutaj, na wypadek gdyby ktoś inny musiał zrobić to samo.

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

Odpowiedz

28

Rozwiązanie to: $string = preg_replace('/[^\p{L}\p{N}\s]/u', '', $string);

+1

Uwielbiam fakt, że jest to zgodne z UTF-8. – HoldOffHunger

1

Spróbuj tego:

<?php 

$string = "Remove these characters: £äó"; 
$string = preg_replace('/[^(\x20-\x7F)]*/','', $string); 
echo $string; 
?> 
+0

Chodzi o to, że znaki 'äó' nie muszą być usunięte ponieważ są one używane w słowach i nie są symbolami. Wręcz przeciwnie, ':' powinno zostać usunięte. –

+0

Oh! Myślałem, że naprzeciwko. Pytanie dotyczyło usunięcia symboli z łańcucha :) –

6
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. 

preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. 

echo $string; // output will be abcdef-g for 'a|"[email protected]£de^&$f g' 
+1

Prawda. Ale potrzebuję czegoś, co pozwoli wszystkim alfabetom, nie tylko alfabetowi łacińskiemu. –

1

Zgodnie innych odpowiedzi, zbudować wyrażenie regularne dla znaków, które pozwalają (np z każdego alfabetu wspierasz i usuwać inne znaki. Oto lista Unicode Block Ranges, aby uzyskać wartości/zakresy znaków dla każdego języka - jest to coś, co musisz skompilować samodzielnie.

1

To jest możliwe można sprawdzić znaki i numery Unicode, ale tylko wtedy, gdy PCRE skompilowano z
--enable-unicode-properties. W takim przypadku możesz użyć polecenia regex \p{Nl}, które będzie pasowało do liter i cyfr Unicode. Dużo więcej informacji na unicode regex w PHP można znaleźć w documentation

EDIT: Po edycji na pytanie

Aby uzyskać symbole używać \P zamiast \p ponownie spojrzeć na dokumentacji PHP I połączone powyżej .

+0

To prawda, mój przyjacielu. Już coś znalazłem i już zredagowałem moje pytanie. –

+0

@Jonur Dodałem zmianę w odpowiedzi na twoje – RMcLeod

Powiązane problemy