Помогите доработать регулярку

Mark1976

Новичок
Регистрация
20.09.2016
Сообщения
4
Благодарностей
0
Баллы
1
Есть жесткая регулярка для проверки введенного пользователем значения.
Значение вводится только цифрами для размера коробки. Оно может быть как целым, так и дробным, но по упрощенной регулярке не выходит можно написать типа 000.456.

Сам вопрос в том, какой момент дописать чтобы регулярка разрешала значение пусто, поскольку если без этого пусто , то требует наличие значения сама регулярка.

Я пробовал поставить к любой группе до окончания строки символ |. Что позволило сразу считать пустое значение верным. НОО, это же позволило вводить буквы и знаки -,+ и тд сразу после цифр.

Сама регулярка:
^([1-9])$|^([1-9][0-9])$|^([0-9]\.[0-9][0-9])$|^([1-9][0-9]\.[0-9][0-9])$|^([1-9][0-9]\.[0-9])$|^([1-9][0-9]\.[0-9][0-9][0-9])$|^([1-9]\.[0-9])$|^([0-9]\.[1-9])$|^([0-9]\.[0-9][0-9][0-9])$|^([1-9][0-9][0-9]\.[0-9][0-9][0-9])$|^([1-9][0-9][0-9]\.[0-9][0-9])$

Что добавить, чтобы считало пустое значение верным?
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
455
Баллы
63
У вас явно не корректно составлено регулярное выражение.
Для того, чтобы вам помочь, необходим кусок текста, где это присутствует и примеры значений, которые нужно найти.
Вы работаете с сайтом при помощи POST/GET ?
Если нет, возможно ваше значение будет проще спарсить при помощи JS или C# кода без использования регулярок.
 

Mark1976

Новичок
Регистрация
20.09.2016
Сообщения
4
Благодарностей
0
Баллы
1
я не программист. у меня есть программист, который написал скрипт.
пользователь в форме на php вводит значение размера упаковки товара, скрипт сразу проверяет правильность значения и сообщает что не корректно, если это так.
скрипт для проверки берет реулярку, что я написал в админке напротив этого атрибута в php форме.
суть регулярки проверить правильность формата введенного значения, которое должно быть только целыми или дробными числами.
вот примеры значений что я пытался задать в регулярке: 7 или 50 или 0.50 или 12.40 или 24.8 и т.д.
но эта регулярка считала отсутствие значения в поле ввода не верным , а это может быть и регулярка давала сообщение что значение не верно и не давала сохранить значение в форме и закрыть ее.
я решил добавить что значение пусто есть правильное. поставил возле одной группы символ |, но это позволило вводить после цифрового значения буквы пользователю.
выглядело это так:
^([1-9])|$|^([1-9][0-9])$|^([0-9]\.[0-9][0-9])$|^([1-9][0-9]\.[0-9][0-9])$|^([1-9][0-9]\.[0-9])$|^([1-9][0-9]\.[0-9][0-9][0-9])$|^([1-9]\.[0-9])$|^([0-9]\.[1-9])$|^([0-9]\.[0-9][0-9][0-9])$|^([1-9][0-9][0-9]\.[0-9][0-9][0-9])$|^([1-9][0-9][0-9]\.[0-9][0-9])$

поскольку писать регулярку типа : ^([1-9]+)$|^([1-9][0-9]+)$|..... или ^(\d+)$|..... или ^([0-9]){1,2}$|.... не давало результата идеально,
я и написал возможные к вводу группы значений. чтобы не было значений типа 000.56

к своей первой регулярке добавил еще группу ^()$

итого регулярка с моими вариантами групп возможных значений и с пусто это верно:
^([1-9])$|^([1-9][0-9])$|^([0-9]\.[0-9][0-9])$|^([1-9][0-9]\.[0-9][0-9])$|^([1-9][0-9]\.[0-9])$|^([1-9][0-9]\.[0-9][0-9][0-9])$|^([1-9]\.[0-9])$|^([0-9]\.[1-9])$|^([0-9]\.[0-9][0-9][0-9])$|^([1-9][0-9][0-9]\.[0-9][0-9][0-9])$|^([1-9][0-9][0-9]\.[0-9][0-9])$|^()$

дала результат.

но видимо есть вариант как уменьшить регулярку по размеру или написать так чтобы не было осечек?
что подскажите?

спасибо заранее
 

Mark1976

Новичок
Регистрация
20.09.2016
Сообщения
4
Благодарностей
0
Баллы
1
Вы работаете с сайтом при помощи POST/GET ? да, вроде так
 

Mark1976

Новичок
Регистрация
20.09.2016
Сообщения
4
Благодарностей
0
Баллы
1
то есть мне нужно обеспечить формат ввода в виде определенного количества цифр до точки и после + естественно целые числа, но не более 2 цифр. Если формат нарушен пользователем, то сайт выводит под полем ввода сообщение об ошибке.
Может регулярка и не верна , но пока не понял как написать иначе.
 

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
Не совсем понял, что Вы хотите, но может подойдет так ^[1-9]?\d((\.){1}\d?[1-9])?$
 
Последнее редактирование:

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
455
Баллы
63
Значение 000.56 является верным по сути, это значение уже в PHP скрипте нужно проверять и приводить к нужному виду методом округления или обрезания + сравнение.
Чтобы не городить кучу регулярок, достаточно было бы одной регулярки, которая сравнивает число либо целое, либо дробное.
 

megalith

Client
Регистрация
04.05.2016
Сообщения
9
Благодарностей
25
Баллы
13
Если я верно понял, задача "примеры значений которые должны пройти в регулярке: 7 или 50 или 0.50 или 12.40 или 24.8 или ПУСТОТА"

Вот решение на PHP если нужно:
PHP:
$pattern = '^(\d{1,3}(\.\d{1,3})?)?$';

// пройдут '1', '12', '123', '1.1', '12.12', '123.123', '' <-- ПУСТОТА
// не пройдут '1234', '1.1234' буквенные и прочие
$num = '123.123';

echo preg_match('/' . $pattern . '/', $num) ? 'True' : 'False';
 

megalith

Client
Регистрация
04.05.2016
Сообщения
9
Благодарностей
25
Баллы
13
дала результат.
но видимо есть вариант как уменьшить регулярку по размеру или написать так чтобы не было осечек?
что подскажите?
Сама регулярка:
^(\d{1,3}(\.\d{1,3})?)?$

Будет работать с целыми и дробными до трех знаков перед точкой и после, а так же с пустым значением
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)