Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Составление регулярного выражения на основе диапазона чисел.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Подскажите пожалуйста в какую сторону рыть.
avtor.fox
Отправлено: 16 Марта, 2012 - 08:57:55
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




Доброго времени суток.

Есть диапазон номеров от 400000 до 499999 (400000-499999). Нужно составить из этого диапазона регулярное выражения вида '^4([0-9]{5})$'. Данное выражение идёт в базу для выборки совпадений.

Как составить регулярку на диапазоне указанном выше я представляю, но как быть к примеру с диапазоном 479949-549499.

Мысль о цикле отпала, так как даже диапазон с разницей в 1000 номеров нагрузит систему по самый не балуй, ибо поиск по шаблону должен обработать более миллиона строк, а диапазонов может быть более тысячи. Сравнение строк по принципу "больше-меньше" тоже не является решением задачи, так как значения в базе могут содержать в себе всевозможные префиксы. Я вижу решение только в составлении регулярок на основе диапазонов.

В данный момент все диапазоны записаны вручную. И хотелось бы автоматизировать процесс создания регулярных выражений, так как диапазоны номеров постоянно добавляются и изменяются.

Пните меня пожалуйста в правильную сторону. Заранее спасибо Улыбка
 
 Top
Мелкий Супермодератор
Отправлено: 16 Марта, 2012 - 09:08:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Сделайте лучше нормальную структуру таблицы, с указанием прямым числом начала и конца диапазона.


-----
PostgreSQL DBA
 
 Top
avtor.fox
Отправлено: 16 Марта, 2012 - 09:20:02
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




Всё дело в том что проверка по шаблону идёт по импортированным строкам из биллинга. И формирование правильных строк на началах невозможно.

Спасибо Вам за идею. Можно в таком случае написать пару функций для формирования "правильных" строк в базе. Но всё же интересна идея по созданию регулярок на основе диапазонов.

(Отредактировано автором: 16 Марта, 2012 - 09:26:44)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Марта, 2012 - 09:54:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




avtor.fox пишет:
И формирование правильных строк на началах невозможно.

Почему?
Хоть триггеры. Интереса ради:

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `splits` (
  2.   `orig` varchar(20) NOT NULL,
  3.   `from` int(11) NOT NULL,
  4.   `to` int(11) NOT NULL
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  6.  
  7. --
  8. -- Триггеры `splits`
  9. --
  10. DROP TRIGGER IF EXISTS `prepareinterval`;
  11. DELIMITER //
  12. CREATE TRIGGER `prepareinterval` BEFORE INSERT ON `splits`
  13.  FOR EACH ROW BEGIN
  14. SET new.FROM=LEFT(new.`orig`,instr(new.`orig`,'-')-1);
  15. SET new.TO=RIGHT(new.`orig`,instr(new.`orig`,'-')-1);
  16.   END
  17. //
  18. DELIMITER ;
  19.  
  20. INSERT INTO `splits` (`orig`) VALUES
  21. ('4500-5000'),
  22. ('5000-6000');
  23.  


-----
PostgreSQL DBA
 
 Top
avtor.fox
Отправлено: 16 Марта, 2012 - 10:36:19
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




Мелкий пишет:
Хоть триггеры. Интереса ради:


Немного упрощает задачу для формирования "больше-меньше", спасибо. Но Вы меня не совсем правильно поняли. Изначально в базу приходят различные друг от друга строки. То бишь может быть номер как '84672550000', так и '2550000' (вариаций куча). Из-за этого я изначально отказался от "больше-меньше" и решил реализовать функцию преобразования диапазонов в рег. выражения. Так как в шаблоне "или" можно указать какой вид может принимать тот или иной номер.

Сейчас уже пошёл в обратную сторону. Привожу все строки полученные от биллинга к одному виду для реализации "больше-меньше".
 
 Top
EuGen Администратор
Отправлено: 16 Марта, 2012 - 13:05:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)






-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
avtor.fox
Отправлено: 19 Марта, 2012 - 09:57:51
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




EuGen пишет:
http://forum.php.su/topic.php?forum=35&topic=780


Большое спасибо за столь неожиданный и в своём роде уникальный ответ Закатив глазки
 
 Top
EuGen Администратор
Отправлено: 19 Марта, 2012 - 11:39:32
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




avtor.fox
Мне любопытно - я проверял то решение на произвольных данных, но не "в промышленном" масштабе. Если Вы решили его использовать, то интересно было бы узнать о его корректности и быстродействии.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
avtor.fox
Отправлено: 20 Марта, 2012 - 08:08:59
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




EuGen
Нуждается конечно в доработках, не "понимает" как закончить выражение. Слишком много ненужных "от и до". Но класс интересный, возьму на доскональное изучение и доработку.
На счёт "промышленного" масштаба.

Скрипт распределения и вычисления т.номеров достаточно долго обрабатывает потоки если к примеру взять строки лог файла и количество номеров которые я приводил выше. При конвертации диапазонов номеров в регулярные выражения (более 1000 и очень много изощрённых) время работы значительно увеличится.

В скором времени допилю Ваш класс и выложу результаты.

P.S. Я написал скриптик конвертации потоков вида "С015300" в регулярные выражения. Он простенький, а вот диапазон номеров я не осилил. Спасибо ещё раз Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB