使我的脚本UTF-8兼容?

时间:2011-11-11 10:41:16

标签: php utf-8

我有一个很长的脚本,它涉及将大量的大文本文件分成单个单词并进行处理。

我将所有内容小写,然后删除除字母和空格以外的所有字符:

$content=preg_replace('/[^a-z\s]/', '', $content); // Remove non-letters

然后爆炸,每个单词进入一个关联的数组作为键,出现次数为值:

$words=array_count_values($content);

我想将脚本转换为能够使用英语以外的语言。 PHP可以用这个吗?我可以使用UTF-8字符作为数组键吗?我将如何preg_replace删除除了来自任何语言的字母之外的所有内容? (所有数字,标点符号和随机字符仍然需要删除。)

3 个答案:

答案 0 :(得分:2)

是的,你可以使用UTF-8字符作为键(有什么东西不能成为PHP数组中的键吗?))。您的正则表达式可能类似于:

/\pL+/u

编辑:   对不起,应该是:

/[^\pL\p{Zs}]/u

答案 1 :(得分:0)

这对你的两个问题都应该有用。

<?php
$string = "Héllø";

echo preg_replace('/[^a-z\s]/i', '', $string) . "\n";
echo preg_replace('/[^a-z\W\s]/ui', '', $string) . "\n";

$arr = array(
    $string => 5
);

print_r($arr);
?>

preg_replace u标志表示它是unicode安全的,i标志表示它不区分大小写。 \W都是单词字符。

答案 2 :(得分:0)

最终,您将无法创建适用于所有语言的算法。 Unicode Standard Annex #29提供了“默认字边界规范”(我不确定在PHP中很容易实现,因为userland中唯一可用的字符属性来源是PCRE; mbstring有此信息,但它没有暴露它),但它警告必须针对特定语言定制算法:

  

不可能提供一套统一的规则来解决跨语言的所有问题或处理给定语言中的所有模糊情况。 [...]

     

对于Thai,Lao,Khmer,Myanmar和其他不使用的脚本,通常在单词之间使用空格,一个好的实现不应该依赖于默认的单词边界规范。 [...]