Как удалить не буквенно-цифровые символы?


Мне нужно удалить все символы из строки, которые не входят в набор a-z A-Z 0-9 или не являются пробелами.

Есть ли у кого-нибудь функция для этого?

Author: kenorb, 2009-03-18

9 answers

Похоже, вы уже почти знали, что хотите сделать, вы в основном определили это как регулярное выражение.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
 589
Author: Chad Birch, 2017-08-23 22:28:16

Для символов юникода это:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
 134
Author: voondo, 2015-09-30 13:33:35

Регулярное выражение - это ваш ответ.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i означает без учета регистра.
  • ^ означает, не начинается с.
  • \d соответствует любой цифре.
  • a-z соответствует всем символам между a и z. Из-за параметра i вам не нужно указывать a-z и A-Z.
  • После \d есть пробел, поэтому в этом регулярном выражении допускаются пробелы.
 43
Author: raspi, 2016-09-16 10:29:34

Вот действительно простое регулярное выражение для этого:

\W|_

И используется по мере необходимости (с прямым разделителем /).

preg_replace("/\W|_/", '', $string);

Протестируйте его здесь с помощью этого замечательного инструмента, который объясняет, что делает регулярное выражение:

Http://www.regexr.com/

 15
Author: Alex Stephens, 2016-02-09 21:09:28
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

Он выбирает все, кроме A-Z, a-z, 0-9, и удаляет их.

Смотрите пример здесь: https://regexr.com/3h1rj

 4
Author: Intacto, 2017-10-25 20:27:36
preg_replace("/\W+/", '', $string)

Вы можете проверить это здесь: http://regexr.com/

 2
Author: DOZ, 2017-07-26 13:33:51

Я тоже искал ответ, и моим намерением было очистить каждую не-альфу, и там не должно быть больше одного места.
Итак, я изменил ответ Алекса на этот вопрос, и это работает на меня preg_replace('/[^a-z|\s+]+/i', ' ', $name)
Приведенное выше регулярное выражение превратило sy8ed sirajul7_islam в sy ed sirajul islam
Пояснение: регулярное выражение будет проверять НЕ ЛЮБЫЕ от а до я в случае, если нечувствительный способ или более одного пробела, и оно будет преобразовано в один пробел.

 0
Author: ssi-anik, 2016-12-16 21:09:28

Если вам нужна поддержка других языков, вместо типичного A-Z, вы можете использовать следующее:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ] определяет отрицаемый (он будет соответствовать символу, который не определен ) класс символов:
    • \p{L}: письмо с любого языка.
    • \p{N}: числовой символ в любом сценарии.
    • : a space character.
  • + жадно соответствует классу персонажа от 1 до неограниченно времена.

Это сохранит буквы и цифры из других языков и алфавитов, а также A-Z:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

Примечание: Это очень старый, но все еще актуальный вопрос. Я отвечаю исключительно для того, чтобы предоставить дополнительную информацию, которая может быть полезна будущим посетителям.

 0
Author: Jonathon, 2018-09-04 13:23:59

Я использую это:

//to remove non english character
$str = preg_replace('/[^\00-\255]+/u', '', $str);
 -8
Author: Hoàng Vũ Tgtt, 2015-04-26 23:02:25