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

Статус
В этой теме нельзя размещать новые ответы.

Solomon Kane

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


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

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

и попробуй такие прописать
Код:
/^(site_)\d*$/
Код:
/^(site_)\d*?$/
Код:
/^(site_)\d+?$/
Код:
/^(site_)\d\d?$/

что будет с такой регуляркой ??
 
Ни одна из регулярок не помогла.

Ошибка такая

Severity: Warning

Message: mkdir() [function.mkdir]: File exists

Появляется, когда в каталоге начинает существовать папка site_10.
 
ну так тогда вопрос у тя не в регулярке а в том что ты функции создания папки передаёш в качестве параметра неизвестно что.

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

или сразу после поиска регуляркой просмотри что она находит через print_r
раз 10 у тя всётаки создаётся значит проблема не в "жадности регулярки"
 
И ещё, это уже вопрос не по тому, что выше. Что надо дописать, чтобы вот тут \d+ проверялось так, чтобы первая цифра не была 0?
Как то так:
Код:
/^(site_)([1-9]+\d+)$/
или так
Код:
/^(site_)([1-9]+0*)$/
Приведи код в районе mkdir, возможно в нем ошибка
 
Еле разобрался, в чём дело, и то совершенно случайно. Алгоритм скрипта у меня таков - проверить папку, если она пуста, создать папку 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.
 
Solomon Kane
вероятно ты делаеш сортировку по ASCII коду а она предполагает
site_1
site_10
site_2
и тд

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

отдели стринг site от числа и сортируй чисто числа
 
Нашёл более простое решение. Если кому пригодится и кто не знает, вот оно

<?php

$arr = array('site_03', 'site_01', 'site_02');

natsort($arr);

print_r($arr);

?>

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



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

$some_var = natsort($arr);

то в итоге получишь не пересортированный массив, а 1. С sort() та же фигня, поэтому вначале и не получалось. Кто знает, чего при присвоении в переменную оно возвращает 1, а не массив?
 
Единственное, что я не понял, это почему если сделать так:
$some_var = natsort($arr);
то в итоге получишь не пересортированный массив, а 1. С sort() та же фигня, поэтому вначале и не получалось. Кто знает, чего при присвоении в переменную оно возвращает 1, а не массив?

Синтаксис языка внимательнее смотри:
Код:
bool sort ( array &$array [, int $sort_flags ] )
bool означает что функция вернет TRUE в случае успешного завершения или FALSE в случае возникновения ошибки
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху