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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 19:18:41
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Всем привет!
Имеется такая строка:
PHP:
скопировать код в буфер обмена
  1. $sql = '((test1 = red end blue OR test2 = red or blue) AND (test2 = 2.1 OR test2 = 2.2)) AND test3 = 3.1';

Как регуляркой получить все "поле = значение" ?
При этом надо учитывать, что AND и OR могут присутствовать в самих значения.

(Отредактировано автором: 04 Марта, 2013 - 19:31:45)

 
 Top
esterio
Отправлено: 04 Марта, 2013 - 19:45:26
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




PHP:
скопировать код в буфер обмена
  1. $pattern = '~(?P<cond>[^=\s\(]+\s=\s[^\)\s]+)~U';

Только почму то не тащит точку
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 19:51:22
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




esterio, спасибо!
Всего-то навсего "\s" ))
А я мучаюсь и так и сяк ))
Как всегда, "всё гениальное - просто" ))
(Добавление)
esterio пишет:
Только почму то не тащит точку

Какую точку ?
Всё вроде тащит )

(Отредактировано автором: 05 Марта, 2013 - 00:49:47)

 
 Top
esterio
Отправлено: 04 Марта, 2013 - 19:57:39
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




незнаю у меня не хотело, мб может я туплу. кстати есть програмка в которой я все рег. разрабативаю
The Regex Coach
рекомендую
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 20:00:21
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




А если будет пробел в строке?
PHP:
скопировать код в буфер обмена
  1. $sql = '((r.test1 = 1.1 OR r.test2 > 1. тут пробел 2) AND (r.test2 = 2.1 OR r.test2 != 2.2)) AND r.test3 = 3.1';

(Отредактировано автором: 04 Марта, 2013 - 21:01:08)

 
 Top
LIME
Отправлено: 04 Марта, 2013 - 21:02:10
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




пробел*?
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 21:03:38
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Я имею в виду шаблон
esterio пишет:
PHP:
скопировать код в буфер обмена
  1. $pattern = '~(?P<cond>[^=\s\(]+\s=\s[^\)\s]+)~U';
 
 Top
LIME
Отправлено: 04 Марта, 2013 - 21:10:21
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




ой сорь...я не дошел до этого пока))...извините выше не посмотрел))
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 21:11:17
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




LIME пишет:
выше не посмотрел

Я так и понял )
 
 Top
LIME
Отправлено: 04 Марта, 2013 - 21:18:26
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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





черд...я думал что неплохо знаю регулярки...быстрый гугл по этому шаблону еще больше убедил меня какой я в сущности нубяра...esterio спасибо за инфу к размышлению
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 21:20:12
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




LIME пишет:
я думал что неплохо знаю регулярки...

Я тоже ))
Я думаю, тут Eugen нужен ))
Он - ас в регулярках ))

(Отредактировано автором: 05 Марта, 2013 - 02:53:56)

 
 Top
LIME
Отправлено: 04 Марта, 2013 - 21:23:33
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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





armancho7777777 ага ...положил Фридла в долгий ящик...думал "ну детали подождут"...и тут как обухом...ЛАМЕР!!!
...зато бодрит))
 
 Top
armancho7777777 Супермодератор
Отправлено: 04 Марта, 2013 - 21:30:02
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




LIME пишет:
положил Фридла в долгий ящик

Я вытащил уже )
 
 Top
esterio
Отправлено: 05 Марта, 2013 - 01:43:13
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Да и я нубом оказался хотя походу не одгу уже написал.
 
 Top
armancho7777777 Супермодератор
Отправлено: 09 Апреля, 2013 - 19:33:53
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Вроде решил задачу.
Просьба к коллегам, если не лень, протестируйте у себя пожалуйста с различными sql строками.
Единственное требование, - заключать строковые значения полей в ковычки, как в примере.

PHP:
скопировать код в буфер обмена
  1.  
  2. $pattern = '~' .
  3.            '(?P<field>[\w\d_]+)\s*' .
  4.            '(?P<cond>[!=|>|<]{1,2})\s*' .
  5.            '(' .
  6.                  '(?P<value>[\d.]+)|' .
  7.                  '(("|\')(?P<value2>.*?)(\6))' .
  8.            ')' .
  9.            '(?=[\s\)\(]*(AND|OR|$))' .
  10.            '~';
  11.  
  12. $callBack = function($matches)
  13. {
  14.         $value = empty($matches['value2'])
  15.                  ? (float)$matches['value']
  16.                  : '"' . escape($matches['value2']) . '"';
  17.                          
  18.         return '`' . $matches['field'] . '`' . $matches['cond'] . $value;
  19. };
  20.  
  21.  
  22. $sql = "((test1 = 'red end blue' OR test2 > 'red 'or blue') " .
  23.        "AND (test2 < 1.1 OR test2 = 2.2)) AND test3 = 3.3";
  24.  
  25. echo preg_replace_callback($pattern, $callBack, $sql);
  26.  
  27.  
  28. function escape($str)
  29. {
  30.         return $str;
  31. }
  32.  

(Отредактировано автором: 17 Апреля, 2013 - 05:42:19)

 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB