Цифры через запятую

Тема в разделе "Регулярные выражения", создана пользователем DupleX, 12 авг 2010.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. DupleX

    DupleX Создатель

    Регистр.:
    20 апр 2006
    Сообщения:
    26
    Симпатии:
    4
    Хочу собрать регулярку цифр через запятую.
    Например, можно:
    37
    12,133,255

    Нельзя:
    пустая строка
    ,
    abc,12
    200,
    ,200

    При этом количество цифр и количество элементов любое.

    Сделал так:
    preg_match('/^[0-9,]+$/', $file[$i]);

    Но просто запятая проходит проверку. Что посоветуете?
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    #\d+[0-9,]*\d+#

    минимум одна цифра в начале, потом 0 или более цифр и запятых, потом минимум одна цифра в конце.

    Пропускает вариант с несколькими запятыми подряд.
     
  3. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Посоветую задавать вопрос, и как-то обозначать для чего это нужно, поскольку может быть регулярка и не нужна. Вообще регулярка нужна там. где по другому никак. Рискну предположить что цифры разделенные запятыми - это перечень неких идентификаторов, и с информацией, которым они соответствуют необходимо провести некоторое действие. В таком случае просто используй explode(",",$string) потом циклом foreach откинешь каждый несоответствующий. Ведь в такого вида задачах почти всегда оправдвно провести операцию над валидными и просто проигнорировать или вывести в ошибку невалидные идентификаторы.
     
    DupleX нравится это.
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Да не, я думаю это тысячи так отделяются. Можно, конечно, было бы порекомендовать
    PHP:
    setlocale();
    number_format();
    money_format();
    Но судя по тону, каким был задан вопрос, это все слишком сложно. Надо регулярку :)

    Как по мне, намного проще не насиловать юзера, чтоб он вводил все в правильном формате, а самому переводить в число:
    PHP:
    $str ',123,456,,78';
    $str preg_replace('#[^0-9]+#','',$str); // уберем левые символы
    $val = (int) $str;
     
  5. DupleX

    DupleX Создатель

    Регистр.:
    20 апр 2006
    Сообщения:
    26
    Симпатии:
    4
    Да, я тоже идеального решения регэкспом найти не смог и склонялся к разбивке в массив.

    Для меня критично не исправлять. Или всё правильно и подходит, иначе не подходит, так как неизвестно что хотел юзер - я ж не пишу ИИ, который должен думать за юзера.

    Просто я думал, что решение в регэкспом есть, раз я регэксп хорошо не знаю.

    Если всё же кто-то найдёт решение регэкспом, пишите. Уже ради спортивного интереса! Проверю на досуге производительность каждого из решений.
     
  6. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    ~^(?:|(?:\d+\,*)*\d+)$~
     
    DupleX нравится это.
Статус темы:
Закрыта.