我想用 null 替换这些字符 [^a-zа-з0-9_],但是当它是多字节字符串时我不能这样做。
我尝试使用 mb_*、iconv、PCRE、mb_eregi_replace 和 u 修饰符(用于 PCRE),但没有一个效果很好。
mb_eregi_replace 有效,但它只输出正确的 utf8 字符串,但它不会替换字符,当 preg_replace 使用相同的正则表达式时..
这是我的代码,适用于 unicode,但它不会替换文本。
function _data($data)
{
mb_regex_encoding('UTF-8');
return mb_eregi_replace('/[^a-zа-з0-9_]+/', '', $data);
}
var_dump(namespace\_data('Текст Removethis- and this _#$)( and also this $*@&$'));
结果是特殊字符 (#_$..) 当它应该替换它们时,如果我将函数更改为 preg_replace(并且没有 unicode)它应该替换它们。
最佳答案
只要您的输入字符串是 UTF-8 编码的 ( test if not or re-encode it to UTF-8 ),您可以安全地使用 preg_replace
如果您将正确的正则表达式与 u (PCRE_UTF8
) modifier 一起使用(the 是小写的 U结束):
function _data($data)
{
return preg_replace('/[^\w_]+/u', '', $data);
}
var_dump(namespace\_data('Текст Removethis- and this _#$)( and also this $*@&$'));
\w
= 任意单词字符u
(然后结束)= 为正则表达式启用 UTF-8。
关于php - preg_replace 西里尔字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743541/