Регулярное выражение PHP-удалить все не буквенно-цифровые символы

Я использую PHP.

моя строка может выглядеть так:

This is a string-test width åäö and some über+strange characters: _like this?

вопрос

есть ли способ, чтобы удалить не буквенно-цифровые символы и заменить их пробелом? Вот некоторые не буквенно-цифровые символы:

  • -
  • +
  • :
  • _
  • ?

Я прочитал много тем об этом, но они не поддерживают другие языки, как этот:

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

требования

  • мой список символов none letter может быть неполным.
  • мой контент содержит символы на разных языках, таких как åäöü. Может быть очень много.
  • не буквенно-цифровые символы должны быть заменены пробелом. Иначе слово прилипло бы друг к другу.

4 ответов


вы можете попробовать это:

preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);

\p{L} означает все алфавитные символы (независимо от алфавита).

\p{N} означает числа.

С помощью модификатора u символы строки темы рассматриваются как символы юникода.

или такой:

preg_replace('~\P{Xan}++~u', ' ', $string);

\p{Xan} содержит буквы и цифры в кодировке Юникод.

\P{Xan} содержит все, что не является буквами и цифрами unicode. (Будьте осторожны, он содержит белый пространства, которые вы можете сохранить с ~[^\p{Xan}\s]++~u )

если вы хотите более конкретный набор разрешенных букв, вы должны заменить \p{L} С диапазонами таблица Юникод.

пример:

preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);

почему здесь используется притяжательный Квантор ( ++ )?

~\P{Xan}+~u даст вам тот же результат, что и ~\P{Xan}++~u. Разница здесь в том, что в первом движке записывается каждая позиция возврата (которая нам не нужна), когда во втором - нет (как в атомной группе). В результате получается небольшая прибыль.

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

однако движок PCRE regex автоматически делает Квантор притяжательным в очевидных ситуациях (пример:a+b =>a++b) если модуль PCRE был скомпилирован с опцией PCRE_NO_AUTO_POSSESS. (http://www.pcre.org/pcre.txt)

больше информации о притяжательных кванторах и атомарных группах здесь (притяжательные квантификаторы) и здесь (атомных групп) или здесь


возможно, вы ищете \W?

что-то типа:

/[\W_]*/

соответствует всем не буквенно-цифровым символам и подчеркиваниям.

\w соответствует всем символам слова (алфавит, цифры, подчеркивания)

\W все матчи не в \w.

и \W соответствует любым не буквенно-цифровым символам, и вы добавляете подчеркивание с \W не соответствует подчеркивания.

EDIT: это делает ваш код станет:

preg_replace("/[\W_]*/", ' ', $string);

на ' ' означает, что все совпадающие символы (не буквы и не числа) станут пробелами.

reEDIT: вы можете дополнительно использовать другой preg_replace чтобы удалить все последовательные пробелы и заменить их одним пробелом, в противном случае вы получите:

This is a string test width     and some  ber strange characters   like this 

вы можете использовать:

preg_replace("/\s+/", ' ', $string);

и, наконец, обрезать начальные и конечные пробелы, если таковые имеются.


Я не совсем уверен, какое разнообразие регулярных выражений вы используете. Однако POSIX-регексы позволяют выражать алфавитный класс, где [: alpha:] представляет любой алфавитный символ.

Так попробовать:

preg_replace("/[^[:alpha:]0-9 ]/", '', $string);

На самом деле, я забыл о [:alnum:] - это делает его проще:

preg_replace("/[^[:alnum:] ]/", '', $string);

\p{xx} это то, что вы ищете, я думаю, посмотреть здесь

Итак, попробуем:

preg_replace("/\P{L}+/u", ' ', $string);