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

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

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

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

Вопрос

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

  • +
  • :
  • _
  • ?

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

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

Требования

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

Вы можете попробовать следующее:

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

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

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

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

Или это:

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

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

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

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

Пример:

 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 )

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

Вы, возможно, ищете \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);