Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Регулярные выражения. Вопрос к знатокам (отредактировал)
цитата
09/02/11 в 19:39
 wdfrretevw
Есть шаблон урла вида
http://domen.com/?dd={key}&ff=ee
и есть сам урл
http://domen.com/?dd=11111111&ff=ee
Вопрос, как можно бысто и просто вытащить {key} тоесть чтоб получить 1111111
__________________________________
уточнил задание
на входе есть шаблоны и урлы
ШАБЛОНЫ
http://domen.com/?dd={key}&ff=ee
http://domen.com/?iii={key}&ff=ee
http://domen.com/?iii=eeeee&ff=ee&uu={key}
http://domen.com/?aaaa={key}
http://domen.com/?{key}
http://domen.com/?iii=eeeee&ff={key}&uu=ddddd

УРЛЫ
http://domen.com/?dd=WW111111&ff=ee
http://domen.com/?iii=WW22&ff=ee
http://domen.com/?iii=eeeee&ff=ee&uu=WWWWW5555
http://domen.com/?aaaa=WW33
http://domen.com/?WW4444444444
http://domen.com/?iii=eeeee&ff=WWWW6666&uu=ddddd

На выходе должно быть (код на ПХП)
WW111111
WW22
WWWWW5555
WW33
WW4444444444
WWWW6666

Последний раз редактировалось: wdfrretevw (10/02/11 в 14:17), всего редактировалось 4 раз(а)
цитата
09/02/11 в 19:50
 Имя
если цифр нигде больше нет то
^.+([0-9]+).+$
цитата
09/02/11 в 20:02
 wdfrretevw
нет не то... и цифры и буквы. такое решение придумал, обрезать с одного края до скобки, и с другого. сейчас попробую.
цитата
09/02/11 в 20:11
 ibiz
проще через
parse_url + explode('&', $url);
цитата
09/02/11 в 20:18
 wdfrretevw
нет тоже не то, нашел простое решение
$itog = substr($url,strrpos($sablon,"{"),-(strlen($sablon)-strrpos($sablon,"}")));
цитата
09/02/11 в 20:29
 taj
ну на питоне как то так можно сделать
result=url[url.find('=')+1:url.rfind('&')]
цитата
09/02/11 в 20:32
 k1ng
фига се простое icon_smile.gif

/.+[dd=](\w)[&ff=].+/
цитата
09/02/11 в 22:05
 Alex AWM
taj писал:
ну на питоне как то так можно сделать
result=url[url.find('=')+1:url.rfind('&')]


на питоне это делается както так
Код:

>>> import urlparse
>>> url="http://example.com/?param=42&blabla=preved"
>>> urlparse.parse_qs(urlparse.urlparse(url).query).get('param', ["default_value"])[0]
'42'
цитата
09/02/11 в 22:24
 taj
И ещё 3мя десятками способов smail54.gif
Тащить целый пакерт чтобы разобрать конкретный пример? просто не мой метод icon_rolleyes.gif
Peace)
цитата
09/02/11 в 22:47
 wdfrretevw
Все не правильно, вы придеживаетесь конкретно этого примера, но он придедет только для ПРИМЕРА. переменые могут быть разные, и {key} может находится в любой части адреса. Если все было бы как в примере и проблемы не возникло.
Шаблоны могут быть
http://domen.com/?dd={key}&ff=ee
http://domen.com/?iii={key}&ff=ee
http://domen.com/?aaaa={key}
http://domen.com/?{key}

Ну и соответствено урлы такие

http://domen.com/?dd=WW1&ff=ee
http://domen.com/?iii=WW2&ff=ee
http://domen.com/?aaaa=WW3
http://domen.com/?WW4

WW1-4 могут принимать разные цифробуквеные значения. Задача стаяла по шаблону вытащить эти WW1-4. Вроде как сейчас понятно объяснил.

решение что привел выше пришлось доработать, не срабатывало, если {key} в конце

if(!$end = strrpos($sablon,"}")+1-strlen($sablon))$end = strlen($url);
$itog = substr($url,strrpos($lin,"{")),$end)
цитата
10/02/11 в 02:32
 CABMIT
Цитата:
Вопрос, как можно бысто и просто вытащить {key} тоесть чтоб получить 1111111

Нихрена не понятно. Откуда надо вытащить - из шаблона {key} или из готового урла параметр?
цитата
10/02/11 в 02:45
 kodek
Да уж, задание сформулировано красиво icon_smile.gif
Ничего не понять.
цитата
10/02/11 в 08:26
 _s_[sov]
ну если из выше показаного примера вытащит единицы то можно например и так Код:
\?dd=(.*)\&
цитата
10/02/11 в 11:05
 freeek
уточни условие, кей появляется самым первым, после домена?
цитата
10/02/11 в 11:21
 taj
kodek писал:
Да уж, задание сформулировано красиво icon_smile.gif
Ничего не понять.
Вот с такими заказчиками и приходиться часто иметь дело.
Какой пример показал, для такого и подсказали. Телепатов как выяснилось тут нет )


По сабжу:
http://domen.com/?dd={key}&ff=ee
http://domen.com/?iii={key}&ff=ee
http://domen.com/?aaaa={key}
http://domen.com/?{key}

Пропускаешь урл через фильтр предложенный мной, он отсеит первые 2 варианта, потом проверка на 3 вариант, и потом уже на 4ой. Как то так, например:
result=None
pos=0
result=url[url.find('=')+1:url.rfind('&')]
if result is None:
   pos=url.find('=')
   if pos>0:
      result=url[pos+1:]
   if result is None:
      result=url[url.find('?')+1:]
цитата
10/02/11 в 11:39
 freeek
че то не посмотрел, на аком яп надо было, но регу одельно вынес

Код:

//---------------------регулярное выражение
  $regex = '%\?([\w\d]+)(?(?=\=)\=([\w\d]+))%is';
  $regex2 = '%\?([\w\d]+)(?(?=\=)\=([\w\d]+))%i';
//---------------------
//---------------------пример 1й
  $str = 'http://domen.com/?dd=WW1&ff=ee
http://domen.com/?iii=WW2&ff=ee
http://domen.com/?aaaaWW3ggsa&dsa=1
http://domen.com/?WW4';
  preg_match_all( $regex, $str, $match, PREG_SET_ORDER );
  $keyArray = array();
  foreach ( $match as $set ) {
      $keyArray[] = ( isset($set[2]) ? $set[2] : $set[1] );
  }
  echo '<pre>';
  print_r( $keyArray );
//---------------------
//---------------------пример 2й
  $str = 'https://www.master-x.com/?blamykey';
  preg_match( $regex, $str, $match );
  $key = ( isset($match[2]) ? $match[2] : $match[1] );
  echo '<pre>';
  print_r( $key );
//---------------------
//---------------------пример 3й
  $str = 'https://www.master-x.com/?blavar=heremykey&other=blavars&etc';
  preg_match( $regex2, $str, $match );
  $key = ( isset($match[2]) ? $match[2] : $match[1] ); 
  echo '<pre>';
  print_r( $key );
//---------------------


получается, если захвачена 2я подмаска, то значит она, иначе это 1я
цитата
10/02/11 в 13:32
 wdfrretevw
_s_[sov] писал:
ну если из выше показаного примера вытащит единицы то можно например и так Код:
\?dd=(.*)\&

это не сработает, нужна таблкетка от жадности
Код:
\?dd=(.*?)\&
[/quote]
цитата
10/02/11 в 13:38
 wdfrretevw
CABMIT писал:
Нихрена не понятно. Откуда надо вытащить - из шаблона {key} или из готового урла параметр?

нужно из УРЛ по шаблону выташить - строку. тесть все то что в {key}. надо наложить - отсечь лишнее из урл, оставить только подходит под кей. незнаю как еще объяснить
цитата
10/02/11 в 13:38
 CABMIT
ТС, ты можешь чётко и ясно сформулировать задачу? Что есть на входе и что должно получиться на выходе? Чётко сформулированная задача - это уже половина решения. Я уверен, что задача тут на 10 секунд, но просто люди не могут понять что ты хочешь icon_confused.gif
цитата
10/02/11 в 13:40
 wdfrretevw
freeek писал:
че то не посмотрел, на аком яп надо было, но регу одельно вынес
Код:

//---------------------регулярное выражение
  $regex = '%\?([\w\d]+)(?(?=\=)\=([\w\d]+))%is';
  $regex2 = '%\?([\w\d]+)(?(?=\=)\=([\w\d]+))%i';
//---------------------
//---------------------пример 1й
  $str = 'http://domen.com/?dd=WW1&ff=ee
http://domen.com/?iii=WW2&ff=ee
http://domen.com/?aaaaWW3ggsa&dsa=1
http://domen.com/?WW4';
  preg_match_all( $regex, $str, $match, PREG_SET_ORDER );
  $keyArray = array();
  foreach ( $match as $set ) {
      $keyArray[] = ( isset($set[2]) ? $set[2] : $set[1] );
  }
  echo '<pre>';
  print_r( $keyArray );
//---------------------
//---------------------пример 2й
  $str = 'https://www.master-x.com/?blamykey';
  preg_match( $regex, $str, $match );
  $key = ( isset($match[2]) ? $match[2] : $match[1] );
  echo '<pre>';
  print_r( $key );
//---------------------
//---------------------пример 3й
  $str = 'https://www.master-x.com/?blavar=heremykey&other=blavars&etc';
  preg_match( $regex2, $str, $match );
  $key = ( isset($match[2]) ? $match[2] : $match[1] ); 
  echo '<pre>';
  print_r( $key );
//---------------------

получается, если захвачена 2я подмаска, то значит она, иначе это 1я


это слишком сложно, я же писал, вот такое решение придумал 2 строчки
Код:

if(!$end = strrpos($sablon,"}")+1-strlen($sablon))$end = strlen($url);
$itog = substr($url,strrpos($lin,"{")),$end)
цитата
10/02/11 в 13:42
 wdfrretevw
freeek писал:
уточни условие, кей появляется самым первым, после домена?

да в любом месте и после домена, и в середине и в конце, в этом то вся и загвозка. Всем рейтинг))))
цитата
10/02/11 в 13:45
 CABMIT
ИМХО регуляркой проще, что-то типа
Код:
/dd=(.+?)&?/

где вместо dd= подставляешь нужный параметр
Ну или через parse_str как было сказано выше
Код:

$string = 'http://domen.com/?dd=WW1&ff=ee';
parse_str(parse_url($string, PHP_URL_QUERY), $result);
echo $result['dd'];


Последний раз редактировалось: CABMIT (10/02/11 в 13:56), всего редактировалось 2 раз(а)
цитата
10/02/11 в 13:45
 taj
Перепеши предложенный мной вариант на strpos и substr и будет тебе счастье)
цитата
10/02/11 в 13:54
 freeek
Код:
'%\?([\w\d]+)(?(?=\=)\=([\w\d]+))%i'


а что сложного в этой реге? подмаска + условная подмаска
если у нас кей гуляет и может быть и там, и там, проще исползовать ее и и смотреть где проявился наш кей

либо в 2й либо в 1й


+ у нас же условие, что мы не знаем как будет называться наш ключ
в случае кода
Код:
?somename=somekey

и тем более Код:
?somekey


показан сам принцип, а ограничения можно наложить уже в зависимости от своих предпочтений
цитата
10/02/11 в 14:04
 freeek
Код:
'%\?(?(?=[\w\d]+\=)[\d\w]+\=([\d\w]+)|([\d\w]+))%i'


либо вообще вот так,

смотрим где появился, а появиться либо в 1м, либо во 2м
Стр. 1, 2, 3  >  последняя »


Эта страница в полной версии