Php регулярное выражение для валюты, без начальных нулей, если сумма не равна 0 или 00 - PullRequest
1 голос
/ 27 апреля 2020

Привет, я пытаюсь создать регулярное выражение для валюты. Часть после десятичной дроби работает нормально. Однако у меня проблемы с первой частью. Я хочу, чтобы он принимал числа, такие как:

00.12
0.12
00
0

Но не числа с ведущими нулями, такие как:

0012.12
00023

Это то, что у меня есть, но я не могу заставить его работать

^([1-9][0-9]*|0|00)+(\.(\d){2})?$

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Вам нужно только проверить с начала строки на наличие 1 или более нулей, за которыми следуют от 1 до 9 ди git. Эта логика c означает, что требуемый шаблон регулярных выражений может быть очень простым.

Код: ( Demo )

$tests = [
    '00.12',
    '0.12',
    '00',
    '0',
    '0012.12',
    '00023',
];
foreach ($tests as $test) {
    echo $test . (preg_match('~^0+[1-9]~', $test) ? ' fail' : ' pass') . "\n";
}

Выход:

00.12 pass
0.12 pass
00 pass
0 pass
0012.12 fail
00023 fail

Чтобы исправить ваш полный шаблон, вам не нужен квантификатор в первой группе: ( Demo )

echo preg_match('~^(?:[1-9]\d*|0{1,2})(?:\.\d{2})?$~', $test) ? ' pass' : ' fail'

Но, честно говоря, почему бы не использовать их как плавающие вместо отказа от значений с ведущими нулями? ( Демо ) Я бы, наверное, сделал это для лучшего пользовательского опыта. Или, может быть, просто стандартизировать вводимые числа с помощью number_format(). ( Демо ) Возможно, здесь звучит проблема XY .

1 голос
/ 27 апреля 2020

Вам необходимо удалить квантификатор + в первой группе захвата - он разрешит несколько повторений 0 или 00. Другими словами, 000, 0000, 00000 и др. c. будет считаться действительным в качестве ведущих частей строки. Группировка допускает любой из трех типов. Таким образом, регулярное выражение, такое как

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

, достигнет вашей цели.

https://regex101.com/r/Tb1x6x/2/

0 голосов
/ 27 апреля 2020

[Отредактировано]

Теперь мой ответ соответствует тому, что действительно спрашивают:

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

Вы можете попробовать это здесь: https://regex101.com/r/8KJhk3/5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...