2009-08-30 13 views
2

PHPでユーザが提出した文字列からウルドゥー語のフレーズを抽出したい。文字列からウルドゥー語/アラビア語のフレーズ/センテンスを抽出する

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

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

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

) 

でもIかかわら:例えば、$stringは、私は次の出力を得る

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

が含まれている場合など今

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

:このため、私は、次のテストコードを試してみました希望のマッチ(دنیا گول ہےآوارہ گرد کی ڈائری、およびابن بطوطہ کے تعاقب میں)を取得すると、私は望ましくないものも得ます(ہےڈائری、およびمیں - それぞれ実際にはそのフレーズの最後の単語です)。誰も私が望ましくないマッチを避ける方法を指摘していただけますか?

+0

アレイのスニペットは涼しく見えます。 – Skurmedel

答えて

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}]+)*とそれに続く単語が一致します。しかし、最後の単語の後の空白には一致しません。あなたが望んでいないと思われます。

+0

ありがとう、アランM.それは私がしたいと正確に動作します。私は、非捕獲のグループについてもっと読むことにします。 –

関連する問題