如何在PHP中使用正则表达式将文本拆分为Unicode单词

时间:2012-01-28 20:55:47

标签: php regex unicode

我有一个网站模块,它从twitter收集一些推文并将它们分成单词放入数据库。但是,由于推文通常有土耳其字符[ıöüğşçİÖÜĞŞÇ],我的模块无法正确划分单词。

例如,短语Aynılabdaçalıştığım分为 Ayn labda alıştığım,但它本应分为Aynı labda çalıştığım

这是我完成工作的代码:

preg_match_all('/(\A|\b)[A-Z\Ç\Ö\Ş\İ\Ğ\Ü]?[a-z\ç\ö\ş\ı\ğ\ü]+(\Z|\b)/u', $text,$a);

你觉得这里有什么问题?

重要提示:我不会因空格字符拆分文字而愚蠢,我需要完全符合这些字符。我不想要任何数字或特殊字符,例如[,。!@#$ ^& * 123456780]。

我需要一个能够拆分它的正则表达式  kısaisimleriile“Vic”ve“Wick”vardı。

进入这个:

kısa
isimleri
ile
Vic
ve
Wick
vardı

更多例子:

我们@test 将是

We
re
test

Fööbär,我们@testto0ÅÄÖ - 123好吗? kthxbai?分为此,

b
r
we
re
test
ok
kthxbai

但我希望它是:

Föö
bär
we
re
test
ÅÄÖ
ok
kthxbai

3 个答案:

答案 0 :(得分:6)

我会看看mb_split()

$str = 'We\'re @test Aynı labda çalıştığım';
var_dump(\mb_split('\s', $str));

给我:

array
  0 => string 'We're' (length=5)
  1 => string '@test' (length=5)
  2 => string 'Aynı' (length=5)
  3 => string 'labda' (length=5)
  4 => string 'çalıştığım' (length=16)

答案 1 :(得分:4)

这个表达式会给你想要的结果(根据你的例子):

/(?<!\pL|\pN)\pL+(?!\pL|\pN)/u

\pL匹配任何unicode字母。需要使用外观来确保不遵循或先于数字,以完全排除包含任何数字的单词。

Example

$str = "Aynı, labda - çalıştığım? \"quote\". Föö bär, we're @test to0 ÅÄÖ - 123 ok? kthxbai?";
preg_match_all('/(?<!\pL|\pN)\pL+(?!\pL|\pN)/u', $str, $m);
print_r($m);

输出:

Array
(
    [0] => Array
        (
            [0] => Aynı
            [1] => labda
            [2] => çalıştığım
            [3] => quote
            [4] => Föö
            [5] => bär
            [6] => we
            [7] => re
            [8] => test
            [9] => ÅÄÖ
            [10] => ok
            [11] => kthxbai
        )

)

答案 2 :(得分:1)

只匹配字边界之间的任何非空格字符。

preg_match_all('/\b(\S+)\b/', $text, $a);

这样,里面的字符并不重要,只要它不是空格,它就会匹配它。