preg_replace与西里尔字符

Ale*_*lov 5 php replace multibyte

我想用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 $*@&$'));
Run Code Online (Sandbox Code Playgroud)

当结果应该替换它们时,结果是使用特殊字符(#_ $ ..),如果我将函数更改为preg_replace(并且没有unicode),它应该替换它们.

hak*_*kre 10

只要输入字符串是UTF-8编码(如果没有,将其重新编码为UTF-8),preg_replace如果使用正确的正则表达式,则可以安全使用.

function _data($data)
{ 
  return preg_replace('/[^\w_]+/u', '', $data);
}

var_dump(namespace\_data('????? Removethis- and this _#$)( and also this $*@&$'));
Run Code Online (Sandbox Code Playgroud)

演示

  • \w =任何单词字符
  • u (在结束时)=为正则表达式启用UTF-8.