3

次の文字列の例があります。

The price is $54.00 including delivery
On sale for £12.99 until December
European pricing €54.76 excluding UK

それらのそれぞれから、価格と通貨の分母のみを返したい

$54.00
£12.99
€54.76

私のプロセスは、通貨記号の配列を持ち、それぞれの文字列を検索し、その後のスペースの前の文字だけをキャプチャすることです-しかし、$67.00は失敗します

したがって、事前設定された通貨記号の配列を実行し、文字列を展開して、ではない非数字の次のインスタンスでそれを切り刻むことはできますか?または、-または正規表現を使用する場合

これは可能ですか?

4

2 に答える 2

4

正規表現で、\p{Currency_Symbol}または\p{Sc}任意の通貨記号を表します。

ただし、PHPは省略形のみをサポートし\p{Sc}/u修飾子が必要です。


正規表現パターンを使用する

/\p{Sc}\s*\d[.,\d]*(?<=\d)/u

たとえば、次のように一致させることができます。

  • 1,234ドル
  • £12.3
  • €5,345.01

.小数点記号および,千単位の区切り文字として使用する場合は、

/\p{Sc}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u

このデモを確認してください。

于 2012-11-18T14:46:26.073 に答える
1

あなたはこのようなもののために行くことができます:

preg_match('/(?:\$|€|£)\s*[\d,.-]+/', $input, $match);

そして、あなたの通貨と価格を中に見つけてください$match

もちろん、通貨記号の配列からその最初の部分を生成することができます。すべてをエスケープすることを忘れないでください:

$escapedCurrency = array_map("preg_quote", $currencyArray);
$pattern = '/(?:' . implode("|", $escapedCurrency) . ')\s*[\d,.-]+/';
preg_match($pattern, $input, $match);

パターンの終わり(実際の数)に対するいくつかの可能な改善:

(?:\$|€|£)\s*\d+(?:[.,](?:-|\d+))?

これにより、1つだけ、.または,その後にいずれか-または数字のみが続くようになります(国際小数点を許可する場合)。

カンマで数千を区切ることだけを許可したい場合は、次のようにすることができます。

(?:\$|€|£)\s*\d{1,3}(?:,\d{3})*(?:\.(?:-|\d+))?

これは、「正しく」フォーマットされた最長の数値(つまり、 $ 1,234.4567,123.456->$ 1,234.4567または€ 123,456789.12-> € 123,456)と一致します。それは本当にあなたがどれだけ正確に行きたいかによります。

于 2012-11-18T14:43:27.043 に答える