PHP正規表現がまったく機能しない


次の正規表現を使用しています:

^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?$

この正規表現を使用して有効な価格をチェックしているため、xxx、llddd、34.23dsds などを検出/拒否します。 100 や 120.00 などを許可します 問題は、空白 (空) の場合、有効なものとして渡されることですが、そうすべきではありません。これを変更する方法はありますか?

ありがとう



------------に答える------------

問題の 1 つは、正規表現でドットを使用していることです。fica "任意の文字".ピリオドを意味する場合は、\.

のようにエスケープする必要があります。

また、少なくとも 1 つの数字が必要なので、アスタリスク * を「1 つ以上」の + に変更してください。

したがって、最初の部分からカンマとピリオドを削除しないと、.,.,.,.,.,.,- を持つことができます:

^[0-9]+(([\.,][-])|([\.,][0-9]{2}))?$


------------に答える------------

正規表現を使用して、単純に「空白の不一致」の問題を解決します:

^[0-9.,]+(([.,][-])|([.,][0-9]{2}))?$

* は 0 以上を許可しますが、+ は 1 つ以上を許可するため、* は空白を許可しますが、+ は許可しません。代わりに、少なくとも 1 つの数字が必要です。

編集:

これを作るには、この正規表現を少しクリーンアップする必要があります

^[0-9]+(?:[.,-](?:[0-9]{2})?)?$

これは、",,," に一致するように解決されます

http://www.regextester.com/?fam=95185

編集 2: @Fuzzzzel は、これが "50,-" ケースと一致しないことを指摘しました。推定。以下は、私が提案した正規表現の最新版です:

^[0-9]+([.,-](-|([0-9]{2}))?)?$

タグ:

関連記事:

フローティングレイアウトを使用して別の場所にボタン/ラベルを配置するPython kivy

iis 7 - IIS 7 の 500.19、ローカルでログインできない