Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите составить регулярку 
V
    Опции темы
Itsys
Дата 25.11.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 12
Всего: 34



Добрый день,

есть структура каталога
Код

/Cat1
/Cat1/Cat1Sub1
/Cat1/Cat1Sub2
/Cat1/Cat1Sub2/Cat1Sub2Sub1
/Cat1/Cat1Sub2/Cat1Sub2Sub2
/Cat2
/Cat2/Cat2Sub1
/Cat2/Cat2Sub1/Cat2Sub1Sub1
/Cat2/Cat2Sub2

и т.д.
Мне надо по передаваемой сылке выбирать всех потомков и всех родителей + первый уровень, т.е. при передаче "/Cat1/Cat1Sub2" должны быть отобраны:
Код

/Cat1
/Cat1/Cat1Sub2
/Cat1/Cat1Sub2/Cat1Sub2Sub1
/Cat1/Cat1Sub2/Cat1Sub2Sub2
/Cat2


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

/[^/]+|/Cat1/[^/]+|/Cat/Cat1Sub2/.+

чем "глубже" передается ссылка, тем больше растет регулярка...

ЗЫ на самом деле проблема немного сложнее (с моей точки зрения)...
Вся структура передается через Ajax в строку вида
Код

<start>145~22~/1/Военное дело. Военная наука. История войн<end><start>146~6~/1/Военное дело. Военная наука. История войн/Военная техника. Оружие<end><start>1002~0~/1/Военное дело. Военная наука. История войн/Военные награды, знамена и униформа<end><start>1129~0~/1/Военное дело. Военная наука. История войн/Военные энциклопедии<end>

Где 145~22~ "довесок" для правильного формирования ссылок, так вот регулярка
Код

<start>\d+~\d+~(/[^/]+|/1/[^/]+)<end>

не работает - не находит не одного значения

ЗЫ регулярки - это вообще моя слабость.... пишутся с большим трудом....

ЗЗЫ формат исходной строки можно переделать... если надо smile
PM MAIL WWW Skype   Вверх
ksnk
Дата 25.11.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Код

$data=array(
'/Cat1'
,'/Cat1/Cat1Sub1'
,'/Cat1/Cat1Sub2'
,'/Cat1/Cat1Sub2/Cat1Sub2Sub1'
,'/Cat1/Cat1Sub2/Cat1Sub2Sub2'
,'/Cat2'
,'/Cat2/Cat2Sub1'
,'/Cat2/Cat2Sub1/Cat2Sub1Sub1'
,'/Cat2/Cat2Sub2'
);

// "/Cat1/Cat1Sub2";

$reg='';
foreach($data as $v) {
  if(preg_match('~^(?:/Cat1(?:/Cat1Sub2(/.*)?)?)?$~i',$v))
     echo($v.'<br>');
};


Добавлено через 3 минуты и 15 секунд
Насчет "Военного дела" - недогнал :-( Можно еще раз и помедленее smile + примеры тех данных, к которым применяться регулярка должна...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Itsys
Дата 25.11.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 12
Всего: 34



Хм.... вроде разделом не ошибся.... писал в JS а получил PHP....  smile 
ksnk, это не в обиду тебе...

1. Отстроить меню на стороне сервера -  это вообще не проблема, только я пишу на перле... проблем в том, что мне надо динамически строить меню на клиенте

2. Количество вложенности - максимум 3 уровня

Полная строка возвращаемая сервером:
Код

<start>145~22~/1/Военное дело. Военная наука. История войн<end><start>146~6~/1/Военное дело. Военная наука. История войн/Военная техника. Оружие<end><start>1002~0~/1/Военное дело. Военная наука. История войн/Военные награды, знамена и униформа<end><start>1129~0~/1/Военное дело. Военная наука. История войн/Военные энциклопедии<end><start>1058~0~/1/Военное дело. Военная наука. История войн/Войны и армии мира<end><start>1057~0~/1/Военное дело. Военная наука. История войн/Войны России до 1917 г. Революции, крестьянские восстания в России<end><start>1032~3~/1/Военное дело. Военная наука. История войн/Вторая мировая война<end><start>1070~0~/1/Военное дело. Военная наука. История войн/Гражданская война в России<end><start>1061~0~/1/Военное дело. Военная наука. История войн/История воздушного флота<end><start>1060~0~/1/Военное дело. Военная наука. История войн/История морского и подводного флота<end><start>1059~0~/1/Военное дело. Военная наука. История войн/КГБ. Разведка и контрразведка. Военный шпионаж. Спецназ<end><start>224~0~/1/Военное дело. Военная наука. История войн/Мемуары. Воспоминания о войне. Биографии<end><start>1069~0~/1/Военное дело. Военная наука. История войн/Первая мировая война<end><start>1062~0~/1/Военное дело. Военная наука. История войн/Стратегия, тактика и теория ведения войн. Терроризм<end><start>192~20~/1/Детектив. Триллер. Боевик<end><start>1183~0~/1/Детектив. Триллер. Боевик/Боевик<end><start>1176~4~/1/Детектив. Триллер. Боевик/Зарубежный детектив<end><start>1181~0~/1/Детектив. Триллер. Боевик/Иронический детектив<end><start>1175~6~/1/Детектив. Триллер. Боевик/Классики зарубежного детектива<end><start>1177~4~/1/Детектив. Триллер. Боевик/Отечественный детектив<end><start>1184~0~/1/Детектив. Триллер. Боевик/Триллер<end><start>147~13~/1/Детская литература<end><start>1053~0~/1/Детская литература/Азбуки и буквари<end><start>1052~0~/1/Детская литература/Внеклассное чтение<end><start>223~0~/1/Детская литература/Для детей младшего и среднего школьного возраста<end><start>152~0~/1/Детская литература/Для малышей и детей от 4 до 7 лет<end><start>149~7~/1/Детская литература/Познавательная и справочная литература<end><start>151~0~/1/Детская литература/Приключения и фантастика для подростков<end><start>153~41~/1/Дом, быт, досуг<end><start>154~0~/1/Дом, быт, досуг/Автомобилистам и автолюбителям<end><start>167~0~/1/Дом, быт, досуг/Анекдоты<end><start>155~6~/1/Дом, быт, досуг/Домашние любимцы<end><start>156~3~/1/Дом, быт, досуг/Домоводство. Ремонт своими руками<end><start>157~0~/1/Дом, быт, досуг/Животноводство. Птицеводство. Пчеловодство<end><start>158~0~/1/Дом, быт, досуг/Комнатные и декоративные растения. Флористика<end><start>159~0~/1/Дом, быт, досуг/Косметология, макияж, прически. Мода, твой стиль<end><start>160~12~/1/Дом, быт, досуг/Кулинария<end><start>161~0~/1/Дом, быт, досуг/Магия. Оккультизм. Предсказания. Астрология<end><start>162~0~/1/Дом, быт, досуг/Музыка<end><start>163~0~/1/Дом, быт, досуг/Рукоделие<end><start>164~0~/1/Дом, быт, досуг/Сад и огород<end><start>165~5~/1/Дом, быт, досуг/Хобби<end><start>166~0~/1/Дом, быт, досуг/Эротика<end><start>203~0~/1/Дом, быт, досуг/Этикет<end><start>168~6~/1/История. Философия. Религия. Психология<end><start>169~1~/1/История. Философия. Религия. Психология/История. Культурология. Мифология. Этнография<end><start>1033~0~/1/История. Философия. Религия. Психология/Политика. Дипломатия. Власть<end><start>170~0~/1/История. Философия. Религия. Психология/Психология<end><start>171~0~/1/История. Философия. Религия. Психология/Религия. Теология. Эзотерика<end><start>172~0~/1/История. Философия. Религия. Психология/Философия. Социология<end><start>173~3~/1/Компьютерные технологии. Программирование<end><start>1030~0~/1/Компьютерные технологии. Программирование/MS Office. Офисные программы Майкрософт<end><start>1028~0~/1/Компьютерные технологии. Программирование/Графика. Web-дизайн. Мультимедиа<end><start>1029~0~/1/Компьютерные технологии. Программирование/Цифровая фотография<end><start>174~6~/1/Медицина и здоровье <end><start>205~0~/1/Медицина и здоровье /Акушерство и гинекология<end><start>175~0~/1/Медицина и здоровье /Ветеринария<end><start>207~0~/1/Медицина и здоровье /Здоровый образ жизни. Диетология<end><start>208~0~/1/Медицина и здоровье /Лечение отдельных заболеваний<end><start>209~0~/1/Медицина и здоровье /Медицинские справочники, атласы и энциклопедии<end><start>206~0~/1/Медицина и здоровье /Народная и нетрадиционная медицина. Траволечение<end><start>1017~0~/1/Научно-популярная литература<end><start>177~14~/1/Подарочные издания, альбомы <end><start>178~1~/1/Подарочные издания, альбомы /Альбомы<end><start>1016~0~/1/Подарочные издания, альбомы /Альбомы для фотографий<end><start>1005~9~/1/Подарочные издания, альбомы /Альбомы на иностранных языках<end><start>179~0~/1/Подарочные издания, альбомы /Подарочные издания<end><start>180~3~/1/Публицистика. Биографии. Мемуары<end><start>1023~0~/1/Публицистика. Биографии. Мемуары/Биографии знаменитых людей. Автобиографии<end><start>1024~0~/1/Публицистика. Биографии. Мемуары/Воспоминания. Мемуары. Письма<end><start>1025~0~/1/Публицистика. Биографии. Мемуары/Публицистика<end><start>182~3~/1/Спорт<end><start>1027~0~/1/Спорт/Боевые искусства<end><start>1035~0~/1/Спорт/Виды спорта<end><start>1036~0~/1/Спорт/Фитнес. Йога<end><start>183~3~/1/Статистическая литература<end><start>184~0~/1/Статистическая литература/Издания 2001 года<end><start>185~0~/1/Статистическая литература/Издания 2002 года<end><start>186~0~/1/Статистическая литература/Перепись населения<end><start>187~11~/1/Учебная литература, словари<end><start>189~10~/1/Учебная литература, словари/Учебная литература<end><start>1038~10~/1/Учебники для школ. Методическая литература<end><start>1047~0~/1/Учебники для школ. Методическая литература/Готовимся к ЕГЭ. Для поступающих в ВУЗы<end><start>1039~0~/1/Учебники для школ. Методическая литература/Для детских садов<end><start>1043~0~/1/Учебники для школ. Методическая литература/Для школ<end><start>1044~0~/1/Учебники для школ. Методическая литература/Развивающие и обучающие книги. Головоломки. Повышаем интеллект<end><start>1045~0~/1/Учебники для школ. Методическая литература/Родителям о воспитании детей<end><start>1090~0~/1/Учебники для школ. Методическая литература/Сочинения по литературе. Произведения школьной программы в кратком изложении<end><start>1048~0~/1/Учебники для школ. Методическая литература/Справочники, энциклопедии школьника. Сборники задач<end><start>1040~0~/1/Учебники для школ. Методическая литература/Учебная литература для начальных классов<end><start>1041~0~/1/Учебники для школ. Методическая литература/Учебная литература для средних классов<end><start>1042~0~/1/Учебники для школ. Методическая литература/Учебная литература для старших классов<end><start>199~31~/1/Фантастика и фэнтези. Мистика и ужасы.<end><start>1139~0~/1/Фантастика и фэнтези. Мистика и ужасы./Анталогии, сборники фантастики<end><start>1089~14~/1/Фантастика и фэнтези. Мистика и ужасы./Зарубежная фантастика<end><start>1122~0~/1/Фантастика и фэнтези. Мистика и ужасы./Мистика. Ужасы<end><start>1088~8~/1/Фантастика и фэнтези. Мистика и ужасы./Отечественная фантастика<end><start>1149~3~/1/Фантастика и фэнтези. Мистика и ужасы./Саги и эпопеи фантастики<end><start>1163~0~/1/Фантастика и фэнтези. Мистика и ужасы./Юмористическая фантастика. Ироническая фэнтези<end><start>1071~16~/1/Филологические науки<end><start>1081~0~/1/Филологические науки/Литературоведение и литературная критика. Литературные музеи и памятные места<end><start>1080~0~/1/Филологические науки/Фольклор. Фольклористика<end><start>1072~13~/1/Филологические науки/Языкознание<end><start>190~26~/1/Художественная литература<end><start>191~0~/1/Художественная литература/Античная литература. Фольклор. Эпос<end><start>1114~0~/1/Художественная литература/Драматические жанры<end><start>193~11~/1/Художественная литература/Зарубежная литература<end><start>194~0~/1/Художественная литература/Исторический роман. Приключения. Авантюрный роман<end><start>195~0~/1/Художественная литература/Классики мировой литературы<end><start>1119~0~/1/Художественная литература/Литература русского зарубежья<end><start>196~0~/1/Художественная литература/Любовный роман<end><start>197~0~/1/Художественная литература/Поэтические жанры<end><start>1031~5~/1/Художественная литература/Русская литературa<end><start>1106~0~/1/Художественная литература/Сатира и юмор. Пародии<end><start>200~4~/1/Энциклопедии и справочники<end><start>201~0~/1/Энциклопедии и справочники/Атласы железных и автомобильных дорог<end><start>1097~0~/1/Энциклопедии и справочники/Атласы и карты мира. Атласы стран, городов и областей<end><start>1096~0~/1/Энциклопедии и справочники/Путеводители по странам, городам, историческим местам<end><start>202~0~/1/Энциклопедии и справочники/Энциклопедии. Энциклопедические словари<end>


Добавлено через 3 минуты и 56 секунд
Работающее (в данный момент меню) можно посмотреть на new.fastbook.ru, только оно работает без префиксов, формата "число~число~", которые нужны для правильного формирования ссылок. Вставил префиксы и все перестало работать. :(
PM MAIL WWW Skype   Вверх
ksnk
Дата 25.11.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Угу ! Это у меня язык заплетается... smile

Насколько я понял - данные - это строка, каждое "данное" в которой разделено start-end и цифрами-прибамбасами вначале. Цифирки пока выкинем для ясности.
Исходное сырье для выборки (одна из строк меню) может быть 
Код

/1/Военное дело. Военная наука. История войн


На Js оно в общем-то почти так-же и переводится...
Код

var data='<start>145~22~/1/Военное дело. Военная наука. История войн<end><start>146~6~/1/Военное дело. Военная наука. История войн/Военная техника. Оружие<end>';

data=data.split(/^<start>\d+~\d+~|<end><start>\d+~\d+~|<end>$/);
var x = data.length,res=[],
    src='/1/Военное дело. Военная наука. История войн'.split('/'),
    srclen=src.length;
    reg='(\\/.*)?';

while(srclen--)
  if (src[srclen])
  {
     reg='(\\/'+src[srclen].replace('.','\\.')+reg+')?';
  }
reg = new RegExp('^'+reg+'$');
//alert(reg);
///^(\/1(\/Военное дело\. Военная наука\. История войн(\/.*)?)?)?$/)

for(var i=0 ; i<data.length;i++) {
  if(data[i] && data[i].match(reg))
     res.push(data[i]);
};
alert(res);

 Данные правда сократил, чтобы форум так страшно не корежило smile









--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Itsys
Дата 26.11.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 12
Всего: 34



Сори.... забыл, что в конструкции new RegExp() надо экранировать символы \, и в результате он у меня искал не "\d+~\d+~" а "d+~d+~"...

И все у меня заработало  smile 

ksnk, а попробовал твою регулярку.... не правильно она работает
1. она выбирает всех потомков, а мне надо только непосредственных (следующий уровень)
2. она не выбирает другие категории того же уровня и уровня выше.

Сори, может быть не совсем правильно поставил задачу....

ЗЫ Отдельное спасибо за подсказку про экранирование спец символов... (.) я чего-то про них совсем забыл...
PM MAIL WWW Skype   Вверх
ksnk
Дата 26.11.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата

а попробовал твою регулярку.... не правильно она работает

2. она не выбирает другие категории того же уровня и уровня выше

Ну, в общем-то да. Не совсем то, хотя в первом посте про категории того-же уровня, вроде ничего не было... ;-)

Впрочем, заработало и хорошо smile



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.