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

247

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

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

Теги:
string

8 ответов

502
Лучший ответ

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

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
  • 8
    zuk1: regexbuddy - большая помощь в этом
  • 2
    Вот пример, если вы хотите включить дефис в качестве разрешенного символа. Мне это нужно, потому что мне нужно было удалить запрещенные символы из имени пользователя Moodle на основе адресов электронной почты: preg_replace ("/ [^ a-z0-9 _. @ \ -] /", '', $ string);
Показать ещё 5 комментариев
113

Для символов Unicode это:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
  • 8
    Теперь это реальный ответ! +1
  • 0
    привет voondo, что с / UI вещь .. как вы это называете? Может кто-нибудь, пожалуйста, пролить мне немного света. Спасибо.
Показать ещё 7 комментариев
39

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

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i означает регистр, нечувствительный к регистру.
  • ^ означает, что не начинается с.
  • \d соответствует любой цифре.
  • a-z соответствует всем символам между a и z. Из-за параметра i вам не нужно указывать a-z и a-z.
  • После \d есть пробел, поэтому в этом регулярном выражении допускаются пробелы.
  • 3
    Мы хотим объяснения по этому поводу :). Люди приходят сюда, чтобы понять, почему это так. Пожалуйста, рассмотрите объяснение Regex тоже! Не каждый достаточно продвинут, чтобы знать, что вы там написали без объяснения причин. Спасибо
  • 0
    @PratikCJoshi Я стоит без учета регистра. ^ означает, не начинается с. \ d соответствует любой цифре. az соответствует всем символам между a и z. Из-за параметра i вам не нужно указывать az и AZ. После \ d есть пробел, поэтому пробелы разрешены в этом регулярном выражении.
Показать ещё 1 комментарий
14

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

\W|_

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

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

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

http://www.regexr.com/

  • 1
    Вам все еще нужен флаг /u противном случае не-буквы ascii также удаляются.
  • 0
    Этот сайт потрясающий. Хороший ресурс!
Показать ещё 1 комментарий
1
[\W_]+

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

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

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

  • 1
    что означает это регулярное выражение / [\ W _] + / u?
0
preg_replace("/\W+/", '', $string)

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

  • 0
    Согласно @Alex Stevens, это не подчеркивает подчеркивание "_".
0

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

-9

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

//to remove non english character
$str = preg_replace('/[^\00-\255]+/u', '', $str);
  • 8
    Это все виды неправильно. Он не делает ничего, как вы думаете, он делает. Это восьмеричные. Восьмеричное 255 - это действительно 173 десятичное или 0xAD гекс. То, что вы написали, эквивалентно [^\x00-\xAD] где 0xAD - это кодовая точка для SOFT HYPEN. Даже если вы делали это правильно, [^\x00-\xFF] совершенно бессмысленно и неправильно.
  • 2
    Хотя код ценится, у него всегда должно быть сопутствующее объяснение. Это не должно быть долго, но это ожидается.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню