preg_match () или аналогичная функция для проверки валюты

1.449,00 1.000.000,55 19,90 etc etc 

Я знаю, что перечисленные выше являются очень переменными, но есть возможности для валюты. Я ищу пример preg_match() или любую другую функцию для рассмотрения возможных случаев выше. Я попытался с примером ниже, но он работает неправильно. Любой шанс дал мне наиболее подходящий образец для этого?

 if (! preg_match('/^[0-9.,]$/', $currency)) { echo 'No good.'; } 

Solutions Collecting From Web of "preg_match () или аналогичная функция для проверки валюты"

Что-то вроде этого должно работать:

 /^((?:\d{1,3}[,\.]?)+\d*)$/ 

Это соответствует:

 ^ - Start of string ( - Capture the following: (?: \d{1,3} - One to three digits [,\.]? - And an optional separator (comma or period) )+ - One or more times \d* - Zero or more digits ) $ - End of string 

Он работает, итеративно сопоставляя все с левой стороной разделителя (если он присутствует), а затем имеет \d* для сбора любых необязательных долей валюты.

Вы можете видеть, что он проходит все ваши тесты .

Изменить: обновленное регулярное выражение выглядит так:

 ^((?:\d\.\d{3}\.|\d{1,3}\.)?\d{1,3},\d{1,2})$ 

Где мы сопоставляем:

  • \d\.\d{3}\. – Одна цифра, период, три цифры, период, ИЛИ
  • \d{1,3}\. – одна и три цифры, период
  • Ничего из перечисленного (из-за ? )

Затем мы сопоставляем:

  • \d{1,3}, – от одной до трех цифр и запятой, а затем
  • \d{1,2} – одна или две цифры

Добавить + после ] чтобы разрешить больше, чем один символ.