我正在尝试将带有大量外国字符和数字的文本拆分为(带有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');
答案 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];
答案 2 :(得分:0)
将CJK分成“单词”是没有意义的。每个角色都是一个单词。如果你使用空格,你就会分成短语。
所以这取决于你实际想要完成的事情。如果你正在索引文本,那么你需要考虑双字母和/或CJK习语。