我想从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] => میں ) )
即使我得到了我想要的匹配项(دنیا گول ہے
,آوارہ گرد کی ڈائری
和ابن بطوطہ کے تعاقب میں
),我也会收到不受欢迎的匹配项(ہے
,ڈائری
和میں
- 每个实际上都是其短语的最后一个单词)。任何人都可以指出我如何避免不受欢迎的比赛?
答案 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}]+)*
匹配它和任何后续单词。但它与最后一个单词之后的任何空格都不匹配,我认为你不想这样做。