2013-06-02 43 views
1

我试图分裂(与使preg_split)有很多外国字符和数字到文字​​和数字长度> = 2,无ponctuation文本。 现在我有这个代码,但它只分成单词,没有考虑数字和所有长度> = 2的长度。 我该怎么办?拆分文本单词数支持Unicode(使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'; 
$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,但我无法得到它的工作原理: -/

+0

你得到的实际结果是什么? –

+0

现在的结果是:阵列 ( [0] => ABC [1] =>文 [2] =>字化け [3] => EFG [4] => Yukarda [5] = >马维 [6] =>斛 [7] =>asağıda [8] =>yağız [9] =>揭掉 [10] =>yaratıldıkta [11] =>米 [12] => siejės [13] => d [14] =>吨 [15] =>颈部 [16] =>dėina [17] =>bandomkojė [18] =>бойынша [19] =>бірінші [20] =>орында [21] =>тұр [22] =>айына ) – Albertine

+0

你的意思,你_don't_希望它匹配任何单词包含标点符号(即'79 .65'不匹配),还是希望它匹配'79'和'65'? – Danack

回答

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) 
+0

呜呜,似乎使preg_split比preg_match_all更高效,这就是为什么我想用它(实$文字实在是巨大的... )。 如果我们忘记了长度条件,这可能吗?我怎么能结合[\ P {N}] +和[\ P {L}] + ??是的,我完全与正则表达式的小白: -/ – Albertine

+0

@Albertine:您可以组成一个字符类这样的'[^ \ p {N} \ p {L}]'但十进制数的住宿问题。 –

+0

@Albertine:IMO,最好的答案是从DEV-NUL-dweiller,可以提高它像这样:'#\ d + \ \ d + | [^ \ W _] {2} +#u' –

1

随着一点点的黑客仅使用数字匹配的单词的一部分之前匹配点分隔的数字:

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

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

+0

谢谢,这个正则表达式对我来说似乎完全不可理解。 – Albertine

0

拆分CJK成“字”是那种毫无意义。每个字符都是一个字。如果您使用空格,则将其分割成短语。

所以这取决于你实际上想要完成什么。如果你正在索引文本,那么你需要考虑bigrams和/或CJK习语。

+0

是的,这是索引文本,所以我会看看这些概念。谢谢 ! – Albertine