从字符串中提取乌尔都语/阿拉伯语短语/句子

时间:2009-08-30 12:02:53

标签: php regex

我想从PHP中用户提交的字符串中提取Urdu短语。为此,我尝试了以下测试代码:

$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 个答案:

答案 0 :(得分:1)

这是因为捕获组([\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}]+)*匹配它和任何后续单词。但它与最后一个单词之后的任何空格都不匹配,我认为你不想这样做。