Регулярно проверяйте числа 0-100 с точностью до двух десятичных знаков - PullRequest
1 голос
/ 18 октября 2011

Так что я знаю, что было бы проще просто использовать функцию php is_numeric, но я пытаюсь создать регулярное выражение, в основном для изучения регулярных выражений, для проверки результатов тестов.Диапазон может быть 0-100, но может иметь 2 знака после запятой.Это то, что у меня есть до сих пор, и оно не работает.

  if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1))
    {
        echo "match";
    }
    else {
        $error = true;
    }

Если я правильно думаю, буквальное значение:

в начале строки найдите символы 0-9 для двух мест.необязательный конец десятичной строки и поиск символов 0-9 в двух местах.необязательный конец строки найти символы 0-9, для 1 места.

Ответы [ 3 ]

6 голосов
/ 18 октября 2011

Почему бы не что-то подобное?

 /^(?:100|\d{1,2})(?:\.\d{1,2})?$/
  • ^ - начало строки
  • (?: 100 | \ d {1,2}) - группа без захвата, 100 или 0-99
  • (?:. \ д {1,2})?- необязательная группа без захвата (. # или. ##)
  • $ - конец строки

Результаты:

php> $ tests =массив (0, 5, 10, 50, 100, 99,5, 75,43, 75,436, 101);

php> foreach ($ tests as $ test) {print $ test."-".preg_match ("/ ^ (?: 100 | \ d {1,2}) (?: \. \ d {1,2})? $ /", $ test)."\ П";}

0 - 1

5 - 1

10 - 1

50 - 1

100 - 1

99,5 - 1

75,43 - 1

75,436 - 0

101 - 0

75F43 - 0

Ваш не работает, даже когда я добавляю косую черту и удаляю лишние ).

php> foreach ($ tests as $ test) {print $ test."-".preg_match ("/ ^ ([0-9] {2,3}) (. [0-9] {2})? $ ([0-9] {1})? $ /", $ test)."\ П";} 0 - 0

5 - 0

10 - 1

50 - 1

100 - 1

99,5 - 0

75,43 - 1

75,436 - 0

101 - 1

75F43 - 1

3 голосов
/ 18 октября 2011

Окружите свое выражение / символами

http://php.net/manual/en/regexp.reference.delimiters.php

1 голос
/ 22 октября 2011

gpojd ответ правильный. Однако вот почему ваше регулярное выражение не работает.

Прежде всего, вам нужны первые $ внутри (). Потому что в противном случае он должен будет совпадать с концом строки, а затем позже с последующим концом строки, что, конечно, невозможно.

Во-вторых, символ точки должен стать \. потому что точка сама по себе соответствует любому символу, но вы хотите фактическую точку. И наконец, вам нужны разделители, как предложил кто-то другой. Вот что соответствует вашему регулярному выражению:

первая, две или три цифры, обязательно. Затем любой символ, за которым следуют две цифры, необязательно. Затем конец строки, обязательный. Затем одна цифра, опционально. Затем снова конец строки, обязательно.

Поскольку вы программист, может быть трудно привыкнуть к мышлению с помощью регулярных выражений; вы привыкли думать в терминах операторов if-else, но регулярные выражения на самом деле не работают таким образом.

Опять же, вариант выше достаточно хорош, но если бы я написал для этого регулярное выражение, я бы добавил:

/^100(.00)?|([1-9]?[0-9])(\.[0-9]{2})?$/

Итак, либо 100, за которыми следует необязательный .00, либо: сначала необязательная ненулевая цифра, а затем обязательная цифра (эти числа составляют цифры от 0 до 99), затем необязательно точка, за которой следуют две цифры.

...