Регулярное выражение 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);