2013-05-07 2 views
12

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

Моя строка может выглядеть следующим образом

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

Вопрос

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

  • -
  • +
  • :
  • _
  • ?

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

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

Требование

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

ответ

27

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

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

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

\p{N} означает цифры.

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

Или это:

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

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

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

Если вы хотите получить более конкретный набор разрешенных букв вы должны заменить \p{L} с диапазонами в unicode table.

Пример:

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

Почему с помощью притяжательного квантор (++) здесь?

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

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

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

Больше информации о притяжательных кванторов и атомных групп here (possessive quantifiers) и here (atomic groups) или here

+0

Эта. Однако, в зависимости от того, как в строке, вы можете включить '\ X'. – Wrikken

+0

Первый работал как и ожидалось. Проголосуйте за это. –

+0

Что делает ++ ~ u? –

1

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

Так попробуйте:

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

На самом деле, я забыл о [цифрой, буквой] - что делает его проще:

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

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

Что-то вроде:

/[\W_]*/ 

Похожее все не алфавитно-цифровой символ и подчеркивания.

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

\W матчей ничего не в \w.

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

EDIT: Это сделает вашу строку кода стать:

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

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

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

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

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

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

И, наконец, обрезать начальное и конечное пространства, если они есть.

1

\p{xx} является то, что вы ищете, я считаю, see here

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

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

Но разве это не заменяет все алфавитные символы, которые OP хочет оставить, как по пространству? – Jerry

+0

Это не должно заменять никаких буквенных символов, нет (обратите внимание на верхний регистр P). – femtoRgon

+0

О, правильно. Но тогда, как насчет числовых символов? Включены ли они в 'L'? Я не уверен, что документация означает «письмо-модификатор» или «другая буква». – Jerry

Смежные вопросы