Odpowiedzi:
Wygląda na to, że prawie wiedziałeś już, co chcesz zrobić, w zasadzie zdefiniowałeś to jako wyrażenie regularne.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
W przypadku znaków Unicode jest to:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
obejmuje, \d
a więc nie \d
jest konieczne. Jest to również błędne, ponieważ pozostawi podkreślenia w wynikowym ciągu (który jest również zawarty w \w
).
i
flaga jest tu naprawdę konieczna, ponieważ [:alnum:]
obejmuje już oba przypadki?
Wyrażenie regularne jest twoją odpowiedzią.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
Oznacza wielkość liter ma znaczenie.^
oznacza, że nie zaczyna się. \d
pasuje do dowolnej cyfry. a-z
dopasowuje wszystkie znaki pomiędzy a
i z
. Ze względu na i
parametr, którego nie musisz określaća-z
i A-Z
.\d
spacji, więc spacje są dozwolone w tym wyrażeniu regularnym.oto naprawdę prosty regex:
\W|_
i używane tak, jak potrzebujesz (z /
ogranicznikiem do przodu ).
preg_replace("/\W|_/", '', $string);
Przetestuj to tutaj za pomocą tego wspaniałego narzędzia, które wyjaśnia, co robi regex:
/u
flagi, w przeciwnym razie usuwane są również litery inne niż ascii.
[\W_]+
Jeśli chcesz obsługiwać inne języki zamiast typowego AZ, możesz użyć następujących opcji:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
definiuje negowaną (pasuje do znaku, który nie jest zdefiniowany) klasę znaków:
\p{L}
: list z dowolnego języka.\p{N}
: znak numeryczny w dowolnym skrypcie.
: znak spacji.+
łapczywie dopasowuje klasę postaci od 1 do nieograniczonej liczby razy.Pozwoli to zachować litery i cyfry z innych języków i skryptów, a także AZ:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Uwaga: To bardzo stare, ale wciąż aktualne pytanie. Odpowiadam wyłącznie w celu dostarczenia dodatkowych informacji, które mogą być przydatne dla przyszłych gości.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Zaznacza wszystkie nie AZ, az, 0-9 i usuwa.
Zobacz przykład tutaj: https://regexr.com/3h1rj
\W
jest odwrotnością tego, \w
które są postaciami A-Za-z0-9_
. Dopasuje więc \W
każdą postać, która nie jest, A-Za-z0-9_
i usunie je. Jest []
to granica zestawu znaków . +
Jest zbędny na zbiorze znaków granicy, ale zwykle oznacza 1 lub więcej znaków. u
Flag rozszerza wyraz m.in. Unicode wsparcie charakter, co oznacza, że nie usunie znaki poza kodem 255 znaków takich jak ª²³µ
. Przykład różnych zastosowań 3v4l.org/hSVV5 ze znakami Unicode i Ascii .
preg_replace("/\W+/", '', $string)
Możesz to przetestować tutaj: http://regexr.com/
Ja też szukałem odpowiedzi i moim zamiarem było wyczyszczenie każdego alfy i nie powinno być więcej niż jedno miejsce.
Więc zmodyfikowałem odpowiedź Alexa na to i to działa na mnie
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
Wyrażenie regularne powyżej zmieniło sy8ed sirajul7_islam
się w sy ed sirajul islam
Objaśnienie: regex nie sprawdzi ŻADNEGO od a do z w przypadku niewrażliwego sposobu lub więcej niż jednej białej spacji i zostanie przekonwertowany na pojedynczy przestrzeń.
Możesz podzielić ciąg na znaki i przefiltrować.
<?php
function filter_alphanum($string) {
$characters = str_split($string);
$alphaNumeric = array_filter($characters,"ctype_alnum");
return join($alphaNumeric);
}
$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123
?>
preg_replace()
wywołaniem.