Bir dizeden Urduca / Arapça ibareleri / cümleler ayıklanıyor

1 Cevap php

PHP bir kullanıcı gönderilen dize dışında Urduca ifadeler ayıklamak istiyorum. Bunun için, ben aşağıdaki test kodu çalıştı:

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

Şimdi ise, örneğin, $string içerir

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

Ben şu çıktıyı alırsınız:

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

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

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

)

Benim istenen sonuç (دنیا گول ہے, آوارہ گرد کی ڈائری, ve ابن بطوطہ کے تعاقب میں), ben de, {[ہے (istenmeyen olanları get rağmen (4)]}, ve میں - her biri) aslında onun cümlenin son kelime. Herkes istenmeyen sonuç nasıl önleyebilirsiniz işaret misiniz?

1 Cevap

Yakalama grubu ([\x{0600}-\x{06FF}]+\s*) birden çok kez eşleşti, her seferinde önceki zaman eşleşti ne yazılmadan olmasıdır. (?:[\x{0600}-\x{06FF}]+\s*) - - sadece olmayan bir yakalama grubuna dönüştürerek beklenen çıktıyı alabilir ama burada daha doğru bir alternatiftir:

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

İlk [\x{0600}-\x{06FF}]+ ardından if başka bir kelime, (?:\s+[\x{0600}-\x{06FF}]+)* o ve sonraki herhangi bir kelime ile eşleşen ardından bazı boşluk var, ilk kelime eşleşir. Ama ben seni istemiyorum sanırım son söz, sonra herhangi bir boşluk eşleşmiyor.