Помогите разобраться с регуляркой

Тема в разделе "Регулярные выражения", создана пользователем Solomon Kane, 9 фев 2011.

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

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Помогите, пожалуйста, разобраться с регуляркой. Есть регулярка:

    Она ищет так, что имя должно содержать site_, а потом любую цифру. Хоть 1000000. Когда эта регулярка срабатывает и проверяются некие условия, начинают генерировать папки типа site_1, site_2 и так далее. Однако доходя до site_10, генерация останавливается и вылетает ошибка. Как я понимаю, всё дело в \d+. Но ведь оно означает 1 или больше цифр. Тогда почему дальше site_10 не идёт?

    И ещё, это уже вопрос не по тому, что выше. Что надо дописать, чтобы вот тут \d+ проверялось так, чтобы первая цифра не была 0?
     
  2. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.039
    код ошибки приведи

    и попробуй такие прописать
    Код:
    /^(site_)\d*$/
    Код:
    /^(site_)\d*?$/
    Код:
    /^(site_)\d+?$/
    Код:
    /^(site_)\d\d?$/
    что будет с такой регуляркой ??
     
    Solomon Kane нравится это.
  3. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Ни одна из регулярок не помогла.

    Ошибка такая

    Появляется, когда в каталоге начинает существовать папка site_10.
     
  4. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.039
    ну так тогда вопрос у тя не в регулярке а в том что ты функции создания папки передаёш в качестве параметра неизвестно что.

    чекай входные данные ... echo перед созданием папки или загоняй их в цикле в массив и в конце выведи print_r($array);

    или сразу после поиска регуляркой просмотри что она находит через print_r
    раз 10 у тя всётаки создаётся значит проблема не в "жадности регулярки"
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.431
    Как то так:
    Код:
    /^(site_)([1-9]+\d+)$/
    или так
    Код:
    /^(site_)([1-9]+0*)$/
    Приведи код в районе mkdir, возможно в нем ошибка
     
    Solomon Kane нравится это.
  6. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Еле разобрался, в чём дело, и то совершенно случайно. Алгоритм скрипта у меня таков - проверить папку, если она пуста, создать папку site_01, если нет, то выбрать все папки с именем site_NN (для этого и была нужна регулярка, на которую я грешил), а потом выбрать последний элемент массива и прибавить к нему единицу. Оказалось, что когда в конечной папке появляется папка site_10, то массив начинает странно работать. Так, до 10, он формируется нормально - (1=>site_1, 2=>site_2), но при десяти происходит следующее (1=>site_1, 2=>site10(!), 3=>site_2). Как итог, скрипт обращается к последнему элементу массива, а он не 10, а 9! Кто знает, как решить эту проблему?

    Функции же типа sort() и прочие подобные ведут себя как-то странно. Вместо пересортированных массивов возвращают 1.
     
  7. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.039
    Solomon Kane
    вероятно ты делаеш сортировку по ASCII коду а она предполагает
    site_1
    site_10
    site_2
    и тд

    тоесть сравнивается код байта а не числовое значение

    отдели стринг site от числа и сортируй чисто числа
     
  8. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Нашёл более простое решение. Если кому пригодится и кто не знает, вот оно

    После обработки функции массив будет типа - site_01, site_02 и так далее. Подробнее о функции можно почитать тут



    http://www.php.su/functions/?natsort



    Единственное, что я не понял, это почему если сделать так:

    $some_var = natsort($arr);

    то в итоге получишь не пересортированный массив, а 1. С sort() та же фигня, поэтому вначале и не получалось. Кто знает, чего при присвоении в переменную оно возвращает 1, а не массив?
     
  9. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.431
    Синтаксис языка внимательнее смотри:
    Код:
    bool sort ( array &$array [, int $sort_flags ] )
    bool означает что функция вернет TRUE в случае успешного завершения или FALSE в случае возникновения ошибки
     
Статус темы:
Закрыта.