За последние 24 часа нас посетили 54288 программистов и 1766 роботов. Сейчас ищут 1617 программистов ...

Как проверить правильность ввода данных?

Тема в разделе "PHP для новичков", создана пользователем el, 26 мар 2008.

  1. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    Как проверить правильность ввода данных, в частности даты?

    Вроде бы есть такая функция, но в описании её ничего не сказано - что означают квадратные скобки, что фигурные (это уже сам по чуть-чуть), что за ^ и т.д. где бы об этом почитать?
    PHP:
    1. ereg ("[0-9]{2}.[0-9]{2}.[0-9]{4})", $data)
    есть конечно вариант
    PHP:
    1. list($dd,$mm,$yy) = explode(".",$data);
    можно потом отдельно поразвлекаться: и ДД проверить, что б не больше 31, и ММ что б не больше 12, да и год, что б не перепутали, но может есть попроще решение?

    общий смысл: проверить корректность ввода 2-х дат, и убедиться, что бы вторая не была "меньше" первой.

    заранее спасибо.
     
  2. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Код (Text):
    1. \b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b
    формат dd/mm/yyyy и d/m/yy, разделители - точка, слеш и мынус :)
     
  3. dAllonE

    dAllonE Guest

    Здесь и здесь и тут немного.
     
  4. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Слишком много вариантов написания даты. Не все проверяются грамматически.

    Пример: второе марта 2008 г. Варианты:

    2/3/08
    3/2/08 (США)
    3/2/2008
    3.2.08
    2 марта 2008
    и т.п.

    Вывод: нельзя разрешать пользователю вводить дату как ему хочется. Вариантов я могу предложить три:
    1. Ввод из календаря
    2. Три комбобокса
    3. 1+2

    Я использую третий вариант. Три комбобокса при получении данных из формы работают как один контрол. Есть у меня даже класс для этого. Работает много лет прекрасно во многих проектах, но... не "учебный". Выложу его тут -- меня разорвут в клочья на плохое программирование. Но работает...
     
  5. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    я конечно извиняюсь, но - ничего не понял, либо со знаками препинания в посте не разобрался... что есть что?
    "?" - что означает?
    "/b" - что означает?
    квадратные скобки что значат?
    и "-/" - нипаняяяяятна, что б не нервничал никто - может просто почитать где дадите? или по какому запросу искать хоть?

    UPD
    где почитать - уже дали, лезу смотреть. спасибо.
     
  6. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    tmanager, у меня немного прощще: формат даты ТОЛЬКО "ДД.ММ.ГГГГ" и никакой другой, у них (конечных пользователей) так и написано (красным и жирным), и именно на это хочу сделать проверку.
     
  7. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    PHP:
    1. preg_match("/^[0-9]{2}[.][0-9]{2}[.][0-9]{4}$/", $data)
    Вродь так должно быть.

    Кстати, пасиба dAllonE - начитался, понял (вродь), запомнил.
     
  8. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Ваши пользователи читают то, что Вы им пишете красным и жирным? Завидую. Тогда всё просто:

    PHP:
    1. <?php
    2. if (!preg_match("^/(\d{1,2})\.(\d{1,2})\.(\d{4})$/",trim($date_string),$m))
    3.    {
    4.    //Огорчаешь юзера
    5.    }
    6. else
    7.  {
    8.  $mdate=(int)$m[1];
    9.  $mon=(int)$m[2];
    10.  $year=(int)$m[3];
    11.  if(!checkdate ($mon,$mdate,$year))
    12.      {
    13.      //Огорчаешь юзера
    14.      }
    15.  }
    16. ?>
     
  9. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    Всем пасиба, конечный вариант выглядит так:
    /^[0-9]{2}[.]{1}[0-9]{2}[.]{1}[0-9]{4}$/ (без проверки на 9999 год)

    Юзерам приходится читать все что красным и жирным, они читают ошибки которые выводятся, в которых написано: "Укажите правильно дату, формат ДД.ММ.ГГГГ", без этого в базу ничего не добавится. А юзеры там не те, которых миллионы на сайте, а юзеры - которые 2-3 человека лазиют по админке и добавляют туда новостишки и прочее.
     
  10. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Сам удалил сообщение.
     
  11. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Это плохо. Лучше, когда им не приходится этого читать.
     
  12. eduha

    eduha Активный пользователь

    С нами с:
    8 ноя 2006
    Сообщения:
    278
    Симпатии:
    0
    Адрес:
    Караганда
    Точка в квадратных скобках не воспринимается как мета-символ
     
  13. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Да, Вы правы. Своё замечание снимаю.