Извлечение урду / арабских фраз / предложений из строки - PullRequest
2 голосов
/ 30 августа 2009

Я хочу извлечь фразы на языке урду из строки, представленной пользователем в PHP. Для этого я попробовал следующий тестовый код:

$pattern = "#([\x{0600}-\x{06FF}]+\s*)+#u";
if (preg_match_all($pattern, $string, $matches, PREG_SET_ORDER)) {
    print_r($matches);
} else {
    echo 'No matches.';
}

Теперь, если, например, $string содержит

In his books (some of which include دنیا گول ہے, آوارہ گرد کی ڈائری, and ابن بطوطہ کے تعاقب میں), Ibn-e-Insha has told amusing stories of his travels.

Я получаю следующий вывод:

Array
(
    [0] => Array
        (
            [0] => دنیا گول ہے
            [1] => ہے
        )

    [1] => Array
        (
            [0] => آوارہ گرد کی ڈائری
            [1] => ڈائری
        )

    [2] => Array
        (
            [0] => ابن بطوطہ کے تعاقب میں
            [1] => میں
        )

)

Даже если я получаю желаемые совпадения (دنیا گول ہے, آوارہ گرد کی ڈائری и ابن بطوطہ کے تعاقب میں), я также получаю нежелательные совпадения (ہے, ڈائری и میں - каждый из которых на самом деле последнее слово его фразы). Кто-нибудь может указать, как я могу избежать нежелательных матчей?

1 Ответ

1 голос
/ 30 августа 2009

Это потому, что группа захвата ([\x{0600}-\x{06FF}]+\s*) сопоставляется несколько раз, каждый раз перезаписывая то, что сопоставлялось в предыдущий раз. Вы можете получить ожидаемый результат, просто преобразовав его в группу без захвата - (?:[\x{0600}-\x{06FF}]+\s*) - но вот более правильная альтернатива:

$pattern = "#(?:[\x{0600}-\x{06FF}]+(?:\s+[\x{0600}-\x{06FF}]+)*)#u";

Первое [\x{0600}-\x{06FF}]+ соответствует первому слову, затем , если , есть пробел, за которым следует другое слово, (?:\s+[\x{0600}-\x{06FF}]+)* соответствует ему и любым последующим словам. Но оно не соответствует ни одному пробелу после последнего слова, которое, я полагаю, вам не нужно.

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