将文字拆分为单词&支持unicode的数字(preg_split)

时间:2013-06-02 22:15:44

标签: php regex unicode utf-8

我正在尝试将带有大量外国字符和数字的文本拆分为(带有preg_split)长度为> = 2且没有ponctuation的单词和数字。 现在我有了这个代码,但它只分成了单词而没有考虑数字和长度> = 2。 我该怎么办?

$text = 'abc 文 字化け, efg Yukarda mavi gök, asağıda yağız yer yaratıldıkta; (1998 m. siejės 7 d.). Ton pate dėina bandomkojė бойынша бірінші орында тұр (79.65 %), айына 41';
$splitted = preg_split('#\P{L}+#u', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

预期结果应为:array('abc', '字化け', 'efg', 'Yukarda', 'mavi', 'gök', 'asağıda', 'yağız', 'yer', 'yaratıldıkta', '1998', 'siejės', 'Ton', 'pate', 'dėina', 'bandomkojė', 'бойынша', 'бірінші', 'орында', 'тұр', '79.65', 'айына', '41');

注意:已经尝试过使用这些文档link1& link2但我无法理解: - /

3 个答案:

答案 0 :(得分:1)

使用 preg_match_all ,然后你可以检查长度条件(这很难用preg_split,但并非不可能):

$text = 'abc 文 字化け, efg Yukarda mavi gök, asağıda yağız yer yaratıldıkta; (1998 m. siejės 7 d.). Ton pate dėina bandomkojė бойынша бірінші орында тұр (79.65 %), айына 41';
preg_match_all('~\p{L}{2,}+|\d{2,}+(?>\.\d++)?|\d\.\d++~u',$text,$matches);
print_r($matches);

说明:

   p{L}{2,}+          # letter 2 or more times
|                  # OR
   \d{2,}+            # digit 2 or more times
   (?>\.\d++)?        # can be a decimal number
|                  # OR
   \d\.\d++           # single digit MUST be followed by at least a decimal 
                      # (length constraint)

答案 1 :(得分:1)

有一点点黑客来匹配用点分隔的数字,然后才匹配数字作为单词的一部分:

preg_match_all("#(?:\d+\.\d+|\w{2,})#u", $text, $matches);
$splitted = $matches[0];

http://codepad.viper-7.com/X7Ln1V

答案 2 :(得分:0)

将CJK分成“单词”是没有意义的。每个角色都是一个单词。如果你使用空格,你就会分成短语。

所以这取决于你实际想要完成的事情。如果你正在索引文本,那么你需要考虑双字母和/或CJK习语。