PHP中的\ preg_replace仅覆盖UTF-8字符的第二个字节

时间:2010-03-31 13:12:06

标签: php regex unicode utf-8

我们有这个代码:

$value = preg_replace("/[^\w]/", '', $value);

其中$value在utf-8中。在此转换之后,将删除多字节字符的第一个字节。如何完全覆盖UTF-8字符?

抱歉,我的PHP不是很好

5 个答案:

答案 0 :(得分:6)

你可以try with the /u modifier

  

此修饰符打开与Perl不兼容的PCRE的其他功能。模式字符串被视为UTF-8。此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得。自PHP 4.3.5起,检查模式的UTF-8有效性。

如果不这样做,请尝试

代替。

答案 1 :(得分:4)

有这个令人讨厌的u modifier to pcre patterns in PHP。它声明正则表达式是用UTF8编码的,但我发现它也将输入视为UTF8。

答案 2 :(得分:2)

u附加到正则表达式,以打开PCRE的多字节unicode模式:

$value = preg_replace("/[^\w]/u", '', $value);

推论

在unicode模式下,PCRE希望所有内容都是多字节的,如果不是,那么 会遇到最后期限的问题。因此,要将任何内容转换为UTF-8(并丢弃任何不可转换的垃圾),我们首先使用:

$value = iconv( 'ISO-8859-1', 'UTF-8//IGNORE//TRANSLIT', $i );

清理并准备输入。

因为所有内容都可以编码成ISO-8859-1(即使一些不起眼的字符显示不正确),并且由于大多数Web浏览器在8859中本地运行(除非被告知使用UTF-8),我们发现此功能为一种安全,有效的方法来“拿走任何东西,丢弃任何垃圾,然后转换成UTF-8”。

mb_ereg_ *自5.3.0起已弃用 - 因此使用这些功能不是正确的方法。

答案 3 :(得分:1)

答案 4 :(得分:0)

使用[^\w]+代替[^\w]

您也可以使用\W代替[^\w]