2

件名として使用している文字列は次のとおりです。

' で 3 泊 4 日のバケーションが 68% 割引。わずか249ドル!

'.\*(\b((enjoy|save)( up to| an extra)?|starting at|as low as|just|only)\b ([0-9]{1,3} ?\%|\$[0-9]+(\.[0-9]{2})?)).\*/i'上記の文字列の一部を抽出して一致させるために使用しています。

私は'$1'交換用として使用しているので、私のフルpreg_matchは次のようになります

preg_match('.*(\b((enjoy|save)( up to| an extra)?|starting at|as low as|just|only)\b ([0-9]{1,3} ?\%|\$[0-9]+(\.[0-9]{2})?)).*/i', '$1', 'Save 68% on a 4 Day/3 Night vacation at. Only $249!')

最初に一致する必要'Save 68%'がありますが、返され続け'Only $249'ます。

最初のワイルドカードの後に​​疑問符を追加すると、'.\*?(\b((enjoy|save)( up to| an extra)?|starting at|as low as|just|only)\b ([0-9]{1,3} ?\%|\$[0-9]+(\.[0-9]{2})?)).\*/i'が返されることがわかりました'save 68%'。これを回避する別の方法はありますか。それは私のグループ化に関係しているようです。私が見つけたように

preg_match('/.*\b(enjoy|save)( up to| an extra)?|starting at|as low as|just|only\b.*/i', '$1', 'Save 68% on a 4 Day/3 Night vacation at. Only $249!')

本来のように返されます'save'が、完全なステートメントで同じことを行うことはできません。

4

2 に答える 2

1

最初のワイルドカードの後に​​疑問符を追加するとうまくいく理由は、それ.*貪欲であり、疑問符 ( .*?) がそれを怠惰にするからです。貪欲な演算子は可能な限り一致します。これは、あなたの場合は行全体です( .*「可能な限り何にでも一致する」と言います)。遅延させると、可能な限りマッチしなくなります。これについては、PCRE マニュアル ページの繰り返しセクションを参照してください。

特定の問題について、遅延演算子を使用することの何が問題になっていますか? それがあなたが望む結果になるなら、私はそれで行くと言います。

于 2012-10-04T17:49:34.320 に答える
0

正規表現の開始と終了から\bと。*を削除します。完全なテキストであっても、それらは必要ありません。見る:

http://rubular.com/r/jYjS5WASTw

于 2012-10-04T17:59:10.823 に答える