2011-08-01 10 views
2

私はPHPアプリケーションを開発中です。私は、文字列が通貨価値として使用可能であることを検証する必要があります。私は以下のバリデーションをしたいと思っています:リベラルREGEX for Money

$5.00 
5 
5.00 
£5.00 

妥当な文字列を受け入れるのに十分なパターンを望みます。私は通貨記号を受け入れることも望みます。しかし、通貨を検証するためには、最終的に値を2つの10進数の浮動小数点として格納するため、任意の文字または文字にすることができます。したがって、データベースに保存されると、 '5.00'または '5.00'は '5.00'になります。私は現在、以下を使用しています:

preg_match('/^[0-9]*\.?[0-9]+$/',$value) 

"5"または "5.00"で動作しますが、通貨記号は考慮しません。通貨記号を考慮してこれを調整するにはどうすればよいですか?

ありがとうございました!

編集:私の正規表現ではあまりにも多くの小数を許可するように見えます。あなたはまた、私はその問題を整理するのに役立つことができますか?任意の通貨記号:あなたはUnicode Character Properties

\p{Sc}\p{Currency_Symbol}を使用する必要がありますすべての通貨記号を許可するように

+0

これを行うための既存の*ライブラリ*があると思います。単一の正規表現(perlの怪物を除く;)はすべてのケースを網羅していない可能性があります。まず、適切なマネータイプ値への変換を含む、どのケースがサポートされているか、そしてそれらが意味するものを正確に判断することです。 –

+0

@pst ...ありがとう!私はこれが正規表現の理想的な使用ではないことを知っていますが、私はちょうど比較的簡単な方法を探していたか、または単純な検証を提供していました。これは防弾である必要はありません。あなたはそのようなライブラリを知っていますか? – tollmanz

+0

$、ユーロ、米ドルなどの通貨デポーターの場合は、それぞれ個別の通貨デポーターを持っている必要があります。そうでなければ、十分に包括的ではありません。 – Nightfirecat

答えて

3

この1を試してみてください:

$value=preg_replace('/^(\p{Sc}?\d*)((\.|,)\d\d\d)?\d*$/u','$1$2',$value); 

しかし、あなたが入力から数を期待している場合は、より良いユーザーが選択可能なリストから通貨を指定し、ちょうどかどうか世話をしformを作るだろうユーザーはPAYPALのしくみだけを紹介します。

+0

ありがとう、私は十分にはっきりしていたとは思わない。私はそれを通貨記号で検証するか、ユーザーが「USD」のようなものを入力する必要があります。 – tollmanz

+0

これは '5.1'と' 5.111'、 '.0'と' 05'を受け入れます。分数セパレータとして '、'を使用する '5.'または通貨は受け付けません。正規表現にはドラゴンが隠れている。 –

+0

は動作しませんhttp://sandbox.phpcode.eu/g/40c44.php – genesis

1

正規表現怪物は、以下:

/^(?<currency_left>\p{Sc}|[A-Z]{3})?\s* 
    (?<amount>(?:(?!,)[,\d]*)(?:(?=.\d)|(?<=\d))(?:\.\d*)?)\s* 
    (?<currency_right>(?(currency_left)|(?:\p{Sc}|[A-Z]{3})))?$/ui 

(\のP {Scが}任意の通貨記号と一致)

これは正の数、続いて、任意の3桁の通貨記号またはコードに一致します、その後に通貨記号または3桁のコードが続きます。数字には10進数、または小数点より前のカンマを含めることができます。通貨記号は数字の前後に表示されますが、両方では表示されません。 Amountグループには小数部分が格納され、currency_leftとcurrency_rightには通貨部分(currency_leftとcurrency_rightは一致しません)が格納されます。