PHP:preg_replace函数,用于替换字符串中的范围的unicode字符

时间:2014-01-23 08:46:48

标签: php unicode preg-replace

我想从字符串中删除一组字符。我使用preg_replace替换unicode字符与空白。

我有一些unicode字符的范围。

适用于以下代码。

$output = "Clean :this; [cnv\al?id@ non AS]CII äóchar^acters.";
$output = preg_replace('/[\x00-\x1F]|[\x21-\x2C]|[\x3A-\x40]|[\x5B-\x5E]|[\x7B-\x7D]|[\x80-\xBF]|[\x2B0-\x36F]/','', $output); 
echo $output; 

但它给出了以下代码的错误。

$output = "Clean :this; [cnv\al?id@ non AS]CII äóchar^acters."; 
$output = preg_replace('/[\x00-\x1F]|[\x21-\x2C]|[\x3A-\x40]|[\x5B-\x5E]|[\x7B-\x7D]|[\x80-\xBF]|[\x2B0-\x36F]|[\x2000-\x2BFF]|[\x2E00-\x2E7F]|[\x3000-\x303F]|[\x1D000-\x1D24F]|[\x1F600-\x1F77F]|[\x1F000-\x1F0FF]/','', $output); 
echo $output; 

错误: - preg_replace():编译失败:偏移量为97的字符类中的范围乱序

我可以使用for循环从字符串中删除unicode字符。所以我需要运行循环以获得更多范围。

请您建议我在上面的代码中哪个更好?要么循环还是preg_replace?如果preg_replace更好,则需要解决上述错误。

1 个答案:

答案 0 :(得分:2)

您的问题是\x只接受两位数字,因此您需要添加大括号,例如:

$output = "Clean :this; [cnv\al?id@ non AS]CII äóchar^acters."; 
$output = preg_replace('/[\x00-\x1F]|[\x21-\x2C]|[\x3A-\x40]|[\x5B-\x5E]|[\x7B-\x7D]|[\x80}-\xBF]|[\x{2B0}-\x{36F}]|[\x{2000}-\x{2BFF}]|[\x{2E00}-\x{2E7F}]|[\x{3000}-\x{303F}]|[\x1{D000}-\x{1D24F}]|[\x{1F600}-\x{1F77F}]|[\x{1F000}-\x{1F0FF}]/u','', $output); 

- 您还需要在正则表达式中添加u修饰符。