正则表达式打破中文字符串

时间:2010-07-30 04:13:59

标签: php regex cjk

当我运行此代码和类似的一些中国人时,ni(你)角色(可能是其他人)被砍掉了。

$sample = "你不喜欢 香蕉 吗";
$parts = preg_split("/[\s,]+/", $sample);
var_dump($parts);

//outputs
array(4) {
  [0]=>
  string(2) "�"
  [1]=>
  string(9) "不喜欢"
  [2]=>
  string(6) "香蕉"
  [3]=>
  string(3) "吗"
}

//in 我觉得 你很 麻烦
//out
array(4) {
  [0]=>
  string(9) "我觉得"
  [1]=>
  string(2) "�"
  [2]=>
  string(3) "很"
  [3]=>
  string(6) "麻烦"
}

我的正则表达式错了吗?

2 个答案:

答案 0 :(得分:6)

如果您的字符串是UTF-8,则必须使用u修饰符:

$sample = "你不喜欢 香蕉 吗";
$parts = preg_split("/[\\s,]+/u", $sample);
var_dump($parts);

如果是其他编码,请参阅unicornaddict的answer

答案 1 :(得分:0)

由于输入字符串是多字节的,我猜你必须用mb_split代替preg_split。