php - preg_replace 西里尔字符

标签 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 $*@&$'));

结果是特殊字符 (#_$..) 当它应该替换它们时,如果我将函数更改为 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 $*@&$'));

Demo

  • \w = 任意单词字符
  • u(然后结束)= 为正则表达式启用 UTF-8。

关于php - preg_replace 西里尔字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743541/

相关文章:

php - 选择选项已选择未选择

php - MySQLi 在使用 SSL 时是否默认验证服务器证书?

php - preg_replace() 中带有编号反向引用的负向回溯无效

php - Laravel - 重定向到页面并滚动到页面底部

php - 用 str_ireplace 替换不区分大小写的字符串不起作用

正则表达式 - 用相同数量的另一个字符替换一个字符的序列

pandas - 将 pandas 数据框中的 None 替换为 NaN

Javascript charAt() 打破多字节字符串

php - 变音符号和 mb_substr 的问题

c++ - 从 ANSI 转换为 Unicode