Как разбить текст на слова Unicode с помощью регулярного выражения в PHP - PullRequest
2 голосов
/ 29 января 2012

У меня есть модуль веб-сайта, который собирает некоторые твиты из твиттера и разбивает их на слова для помещения в базу данных.Однако, поскольку твиты обычно имеют турецкие символы [ıöüğşçİÖÜĞŞÇ], мой модуль не может правильно разделить слова.

Например, фраза 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ısa isimleri ile "Vic "ve" Wick "vardı.

в это:

kısa
isimleri
ile
Vic
ve
Wick
vardı

Больше примеров:

Мы @ test будетбыть

We
re
test

Föö bär, мы @ тест to0 ÅÄÖ - 123 хорошо?kthxbai? разбит на это,

b
r
we
re
test
ok
kthxbai

но я хочу, чтобы это было:

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

Ответы [ 3 ]

6 голосов
/ 29 января 2012

Я бы посмотрел на 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)
4 голосов
/ 29 января 2012

Это выражение даст вам желаемый результат (согласно вашим примерам):

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

\pL соответствует любой букве Юникода. Обозначения необходимы, чтобы убедиться, что за ними не следуют и не предшествуют числа, чтобы полностью исключить слова, содержащие любые числа.

Пример

$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
        )

)
1 голос
/ 29 января 2012

Просто сопоставьте любой непробельный символ, помещенный между границами слов.

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

Таким образом, не имеет значения, какие символы находятся внутри, если это не пробел, он будет совпадатьэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...