Ответы:
Похоже, вы почти знали, что вы уже хотели делать, вы в основном определили это как регулярное выражение.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Для символов Юникода это:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
включает \d
и так \d
ненужно. Кроме того, это неправильно, потому что это также оставит подчеркивание в результирующей строке (которая также включена в \w
).
i
флаг здесь необходим, поскольку [:alnum:]
уже охватывает оба случая?
Регулярное выражение ваш ответ.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
Означает нечувствительны к регистру.^
значит, не начинается с. \d
соответствует любой цифре. a-z
соответствует всем символам между a
и z
. Из-за i
параметра вам не нужно указывать a-z
и A-Z
.\d
пробела допускаются пробелы в этом регулярном выражении.вот действительно простое выражение для этого:
\W|_
и используется по мере необходимости (с /
разделителем косой черты).
preg_replace("/\W|_/", '', $string);
Проверьте это здесь с помощью этого замечательного инструмента, который объясняет, что делает регулярное выражение:
/u
флаг, в противном случае не-буквы ascii также удаляются.
[\W_]+
Если вам требуется поддержка других языков, вместо типичного AZ, вы можете использовать следующее:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
определяет отрицательный (он будет соответствовать символу, который не определен) класс символов:
\p{L}
: письмо с любого языка.\p{N}
: числовой символ в любом скрипте.
: космический символ.+
жадно соответствует классу персонажа от 1 до неограниченного количества раз.Это сохранит буквы и цифры из других языков и сценариев, а также 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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Примечание: это очень старый, но все еще актуальный вопрос. Я отвечаю исключительно, чтобы предоставить дополнительную информацию, которая может быть полезна для будущих посетителей.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Он выбирает все, а не AZ, az, 0-9 и удаляет его.
Смотрите пример здесь: https://regexr.com/3h1rj
\W
является инверсией \w
которых являются символы A-Za-z0-9_
. Так \W
будет соответствовать любой символ, которого нет, A-Za-z0-9_
и удалить их. []
Является набор символов границы . Это +
избыточно на границе набора символов, но обычно означает 1 или более символов. u
Флаг расширяет выражение , чтобы включить поддержку юникода характер, то есть он не будет удалять символы за пределами кода символа 255 , например , как ª²³µ
. Пример использования 3v4l.org/hSVV5 с символами Unicode и ASCII.
preg_replace("/\W+/", '', $string)
Вы можете проверить это здесь: http://regexr.com/
Я тоже искал ответ, и мое намерение состояло в том, чтобы убрать все не альфа, и там не должно быть больше одного пробела.
Итак, я изменил ответ Алекса на это, и это работает для меня
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
. Выражение выше обратилось sy8ed sirajul7_islam
к sy ed sirajul islam
Объяснению: регулярное выражение будет проверять НЕ ЛЮБОЙ от a до z в случае нечувствительного к регистру пути или более чем один пробел, и он будет преобразован в один пространство.
Вы можете разбить строку на символы и отфильтровать ее.
<?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()
вызовом.