1

我正在尝试将具有大量外来字符和数字的文本(使用 preg_split)拆分为长度> = 2且没有标点符号的单词和数字。现在我有了这个代码,但它只分成单词而不考虑数字和长度> = 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');

注意:已经尝试过使用这些文档链接 1链接2,但我无法让它工作:-/

4

3 回答 3

2

使用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)
于 2013-06-02T22:56:41.540 回答
1

在仅将数字匹配为单词的一部分之前,通过一点技巧来匹配由点分隔的数字:

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

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

于 2013-06-02T23:07:48.970 回答
0

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

因此,这取决于您实际要完成的工作。如果您正在索引文本,那么您需要考虑二元组和/或 CJK 成语。

于 2013-06-02T23:09:53.447 回答