Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Регулярные выражения. Вопрос к знатокам (отредактировал)
цитата
10/02/11 в 14:06
 wdfrretevw
CABMIT писал:
ТС, ты можешь чётко и ясно сформулировать задачу? Что есть на входе и что должно получиться на выходе? Чётко сформулированная задача - это уже половина решения. Я уверен, что задача тут на 10 секунд, но просто люди не могут понять что ты хочешь icon_confused.gif


на входе есть шаблоны и урлы
ШАБЛОНЫ
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=WW111111&ff=ee
http://domen.com/?iii=WW22&ff=ee
http://domen.com/?aaaa=WW33
http://domen.com/?WW4444444444

На выходе должно быть
WW111111
WW22
WW33
WW4444444444
цитата
10/02/11 в 14:18
 wdfrretevw
на примерах уточнил задание.
походу регулярками эту проблему не решить. в любом случае всем 4+ пишите еще добавлю)))

Последний раз редактировалось: wdfrretevw (10/02/11 в 14:20), всего редактировалось 1 раз
цитата
10/02/11 в 14:19
 freeek
моя рега бьет все твои примеры

что еще надо icon_wink.gif
цитата
10/02/11 в 14:22
 wdfrretevw
freeek писал:
моя рега бьет все твои примеры
что еще надо icon_wink.gif

напиши готовую функцию. на входе шаблон и урл, на выходе кей. проверю отпишусь
цитата
10/02/11 в 14:32
 freeek
Код:
function getKey( $query )
{
      preg_match( '%\?([\w\d]+)(?(?=\=)\=([\w\d]+))%i', $query, $match );
      return ( isset($match[2]) ? $match[2] : $match[1] );
}

echo '<pre>';
  print_r( getKey('?WW4444444444') );

echo '<pre>';
  print_r( getKey('https://www.master-x.com/?blavar=150&shjjf=12') );

или
Код:
function getKey( $query )
{
      preg_match( '%\?(?(?=[\w\d]+\=)[\d\w]+\=([\d\w]+)|([\d\w]+))%i', $query, $match );
      return ( isset($match[2]) ? $match[2] : $match[1] );
}

echo '<pre>';
  print_r( getKey('?blavar=35&shjjf=12') );

echo '<pre>';
  print_r( getKey('http://domen.com/?WW4444444444') );
 
цитата
10/02/11 в 14:42
 freeek
щас еще раз пили ?name=key

если наш кей может появиться хуй знает где и как я понял на это самое "хуй знает есть шаблон, то рега не нужна, на первый взляд разовать урл по границе кея в шаблоне

блеать icon_smile.gif, торопомотрел,

в результате есть одно НО, регу уместо использвать когда тот самый вариант, с ?key или ?name=key

если наш кей может появиться хуй знает где и как я понял на это самое "хуй знает" есть шаблон, то рега не нужна, на первый взляд разовать урл по границе кея в шаблоне

блеать icon_smile.gif, тороплюсь, времени нет проверять, но если надо так то можно сделать и так

ничего невозможного нет
цитата
10/02/11 в 14:49
 freeek
Код:
  function getKeys( $patter, $string )
  {
      return str_ireplace( explode( '{key}', $patter ), '', $string );
  }
 
  echo '<pre>';
  print_r(getKeys('http://domen./?{key}=eeeee&ff=ee&uu=', 'http://domen./?iii=eeeee&ff=ee&uu='));
  echo '</pre>';


короче вот, условие, что шаблон строго соответсвует той строке где ищем

все убегаю smail101.gif
цитата
10/02/11 в 17:12
 AWD
на icon_smile.gif
может кривовато, как для истинных мастеров и любителей классов, функций и регулярок, зато работает. icon_biggrin.gif

$shablon = array('http://domen.com/?qwe=123&dd={key}&ff=ee',
         'http://domen.com/?iii={key}&ff=ee',
         'http://domen.com/?aaaa={key}',
         'http://domen.com/?{key}');

$url = array('http://domen.com/?dd=WW111111&ff=ee',
'http://domen.com/?iii=WW22&ff=ee',
'http://domen.com/?aaaa=WW33',
'http://domen.com/?WW4444444444');


$k = array();
foreach($shablon as $val) { //собираем шаблоны
   preg_match( '~[\?|&]+(\w*=){key}~i', $val, $match );
   if(isset($match[1])) {
      $k[] = $match[1];
      }
   }
$res = array();
foreach($url as $u) { //выделяем кеи
   if(preg_match('~\?(\w+$)~', $u, $match)) {
      $res[] = $match[1];
      continue;
      }
   foreach($k as $sh)
      if(preg_match('~[\?|&]+'.$sh.'(\w+)~', $u, $match)) {
         $res[] = $match[1]."\r\n";
         break;
         }
   }
echo '<pre>';
print_r($res);
echo '</pre>';
цитата
10/02/11 в 17:40
 CABMIT
А исходные условия именно такие? Почему именно шаблоны урлов? Нельзя ли как-то поменять условие, например:
вместо шаблона http://domen.com/?qwe=123&dd={key}&ff=ee и урла http://domen.com/?dd=WW111111&ff=ee сказать, что просто надо в данном урле определить значение параметра dd. Это же эквивалентно твоей задаче? Или в другом случае, найти ключ первого параметра (http://domen.com/?WW4444444444). По-моему это более правильная постановка задачи
цитата
10/02/11 в 21:23
 wdfrretevw
freeek писал:
Код:
  function getKeys( $patter, $string )
  {
      return str_ireplace( explode( '{key}', $patter ), '', $string );
  }
 
  echo '<pre>';
  print_r(getKeys('http://domen./?{key}=eeeee&ff=ee&uu=', 'http://domen./?iii=eeeee&ff=ee&uu='));
  echo '</pre>';

короче вот, условие, что шаблон строго соответсвует той строке где ищем
все убегаю smail101.gif

хорошее решение - но не проверил, щас лень, завтра уже. Всем 4+
САБМИТ. почему именно ДД? глянь внимательно, разные кеи. Да и задача вытащить из строки {key} , а если будет строка например http://domen.com/{key}/index.php то как?
цитата
10/02/11 в 21:27
 wdfrretevw
еще раз хочу напомнить, решение уже найдено (3 раз уже пишу). Всем кто принял участие моя благодарность.
цитата
10/02/11 в 22:38
 AWD
если ты про это решение
$itog = substr($url,strrpos($sablon,"{"),-(strlen($sablon)-strrpos($sablon,"}")));
то при перестановке переменных местами выйдет баг.
a=1&b=2 или b=2&a=1
>>(3 раз уже пишу)
ну, вообще-то парой мессаг назад ты говоришь, что уточнил задание,
freeek-у писал: "напиши готовую функцию. на входе шаблон и урл, на выходе кей. проверю отпишусь"...
сорри, что вмешался... удаляюсь... ctrl+alt+del
цитата
10/02/11 в 23:40
 Noobus Boobus
ююю
цитата
10/02/11 в 23:43
 ibiz
freeek писал:
Код:
  function getKeys( $patter, $string )
  {
      return str_ireplace( explode( '{key}', $patter ), '', $string );
  }
 
  echo '<pre>';
  print_r(getKeys('http://domen./?{key}=eeeee&ff=ee&uu=', 'http://domen./?iii=eeeee&ff=ee&uu='));
  echo '</pre>';

короче вот, условие, что шаблон строго соответсвует той строке где ищем
все убегаю smail101.gif


самое правильно решение в топике smail54.gif
цитата
11/02/11 в 10:08
 AWD
ibiz писал:
самое правильно решение в топике smail54.gif
если домен с www или без - и уже не работает, ровно как и при перестановке гет-переменных местами... icon_mad.gif я понимаю, коротко, красиво, но... имхо, не правильно не учитывать разные варианты...
цитата
11/02/11 в 14:02
 freeek
что значит не работает

все работает, тут надо понимать о чем речь и абстрагироваться от урлов с домена и т.д.

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

для этой строки существует строго соответствующий ей шаблон,
когда применим мою функцию, получим то что искали

Код:
echo '<pre>';
  print_r(getKeys('blablsddvh{key}ehebebeb', 'blablsddvhfuckehebebeb'));

выведет
Код:
fuck
цитата
11/02/11 в 14:52
 AWD
freeek писал:
что значит не работает
все работает, тут надо понимать о чем речь и абстрагироваться от урлов с домена и т.д.
вопрос был о урлах, а они бывают как с ввв, так и без. гугол бывает как ком, так и фр. и не обязательно, что после ы=кей&з=12 "з" всегда будет 12? а вдруг 24? вылет...
но в рамках жесткого шаблона - да, твое решение изящно smail54.gif
цитата
11/02/11 в 15:07
 freeek
в том то и дело в рамках жёсткого шаблона, все манипуляции по приведению соответствующего шаблона, должны быть проделаны заранее

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

невозможно написать ни регу, ни еще что то, не зная того что мы ищем и где мы это будем искать, поэтому отчасти решение с жестким шаблоном нас должно удовлетворить, а все манипуляции с подборкой нужного шаблона проводятся заранее, что уже совсем другая задача
цитата
12/02/11 в 20:07
 iRoot
сперва
http://php.net/manual/en/function.parse-url.php
потом
http://www.php.net/manual/en/function.parse-str.php
на выходе ассоциативный массив вида ключ-значение
цитата
13/02/11 в 21:03
 CABMIT
iRoot: именно такое решение я и предлодил на предыдущей странице
цитата
13/02/11 в 21:52
 freeek
нет, не пойдет, потому что ему надо искать его кей не только в строке запроса, а где угодно
т.е. мы не знаем где этот кей будет находиться, нахождение нашего кея упирается в шаблон

не знаю конечно для чего это и где это применяется, но по факту так и есть
цитата
14/02/11 в 20:38
 CABMIT
Тогда просто надо составить список символов, из которых может состять кей, и ограничителей.
Не уверен, что эта задача решается в общем случае, либо необходимы уточнения.

ТС, не обращай внимания на то что мы тут пишем. Мы в курсе, что ты уже нашёл решение, у нас просто спортивный интерес icon_smile.gif

P.S. ну или просто взять шаблон, заменить в нём {key} на (.+?), остальное preg_quote. Ну и в итоге preg_match конечно же

Последний раз редактировалось: CABMIT (14/02/11 в 20:46), всего редактировалось 1 раз
цитата
14/02/11 в 20:45
 CABMIT
Код:
function get_key($template, $string)
{
   preg_match('/'.str_replace('\{key\}', '(.+?)', preg_quote($template, '/')).'/', $string, $matches);
   return isset($matches[1]) ? $matches[1] : false;
}

echo get_key('http://domen.com/?dd={key}&ff=ee', 'http://domen.com/?dd=WW111111&ff=ee'); // -> WW111111


Enjoy icon_cool.gif
цитата
14/02/11 в 21:24
 Alex AWM
Кстати последний вариант решения _точно_ соотвествует ТЗ ;)

PS Впрочем сам бы я предпочел все таки решение с urlparse, и отдельной обработкой случаев когда {KEY} в пути/домене, или когда {KEY} -- весь query_string (то есть случай domain.com/?{key}) -- будет немного более громоздко, зато более понятно, предсказуемо и поддерживаемо)
цитата
15/02/11 в 03:23
 freeek
CABMIT писал:
Код:
function get_key($template, $string)
{
   preg_match('/'.str_replace('\{key\}', '(.+?)', preg_quote($template, '/')).'/', $string, $matches);
   return isset($matches[1]) ? $matches[1] : false;
}
echo get_key('http://domen.com/?dd={key}&ff=ee', 'http://domen.com/?dd=WW111111&ff=ee'); // -> WW111111

Enjoy icon_cool.gif


да неплохо, только зачем icon_wink.gif

смысл то не меняется, зачем использовать реги там где можно обойтись без них

логика моей функции простая, кей находиться в том месте, где указана метка в шаблоне
чтоб его извлечь, надо обрезать строку по границам этой метки и мы получим то что искали

в твоем случае, мы ищем вхождение первой подмаски, описывающей метку, под которой лежит сам кей

по сути одно и тоже, ну может чуть чуть помедленнее

icon_smile.gif
Стр. « первая   <  1, 2, 3  >  последняя »


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