Я использую 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);