Реклама на сайте Advertise with us

Регулярные выражения. Вопрос к знатокам (отредактировал)

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

В чем сила, БРАТ?

С нами с 22.03.05
Сообщения: 749
Рейтинг: 246

Ссылка на сообщениеДобавлено: 10/02/11 в 14:06       Ответить с цитатойцитата 

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

Да я здесь...

0
 

В чем сила, БРАТ?

С нами с 22.03.05
Сообщения: 749
Рейтинг: 246

Ссылка на сообщениеДобавлено: 10/02/11 в 14:18       Ответить с цитатойцитата 

на примерах уточнил задание.
походу регулярками эту проблему не решить. в любом случае всем 4+ пишите еще добавлю)))

Последний раз редактировалось: wdfrretevw (10/02/11 в 14:20), всего редактировалось 1 раз

Да я здесь...

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 10/02/11 в 14:19       Ответить с цитатойцитата 

моя рега бьет все твои примеры

что еще надо icon_wink.gif

4
 

В чем сила, БРАТ?

С нами с 22.03.05
Сообщения: 749
Рейтинг: 246

Ссылка на сообщениеДобавлено: 10/02/11 в 14:22       Ответить с цитатойцитата 

freeek писал:
моя рега бьет все твои примеры
что еще надо icon_wink.gif

напиши готовую функцию. на входе шаблон и урл, на выходе кей. проверю отпишусь

Да я здесь...

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 10/02/11 в 14:32       Ответить с цитатойцитата 

Код:
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') );
 

4
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 10/02/11 в 14:42       Ответить с цитатойцитата 

щас еще раз пили ?name=key

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

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

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

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

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

ничего невозможного нет

4
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 10/02/11 в 14:49       Ответить с цитатойцитата 

Код:
  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
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 10/02/11 в 17:12       Ответить с цитатойцитата 

на icon_smile.gif
может кривовато, как для истинных мастеров и любителей классов, функций и регулярок, зато работает. icon_biggrin.gif
Код: [развернуть]

4
 



С нами с 20.02.06
Сообщения: 248
Рейтинг: 366

Ссылка на сообщениеДобавлено: 10/02/11 в 17:40       Ответить с цитатойцитата 

А исходные условия именно такие? Почему именно шаблоны урлов? Нельзя ли как-то поменять условие, например:
вместо шаблона http://domen.com/?qwe=123&dd={key}&ff=ee и урла http://domen.com/?dd=WW111111&ff=ee сказать, что просто надо в данном урле определить значение параметра dd. Это же эквивалентно твоей задаче? Или в другом случае, найти ключ первого параметра (http://domen.com/?WW4444444444). По-моему это более правильная постановка задачи

4
 

В чем сила, БРАТ?

С нами с 22.03.05
Сообщения: 749
Рейтинг: 246

Ссылка на сообщениеДобавлено: 10/02/11 в 21:23       Ответить с цитатойцитата 

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 то как?

Да я здесь...

0
 

В чем сила, БРАТ?

С нами с 22.03.05
Сообщения: 749
Рейтинг: 246

Ссылка на сообщениеДобавлено: 10/02/11 в 21:27       Ответить с цитатойцитата 

еще раз хочу напомнить, решение уже найдено (3 раз уже пишу). Всем кто принял участие моя благодарность.

Да я здесь...

0
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 10/02/11 в 22:38       Ответить с цитатойцитата 

если ты про это решение
$itog = substr($url,strrpos($sablon,"{"),-(strlen($sablon)-strrpos($sablon,"}")));
то при перестановке переменных местами выйдет баг.
a=1&b=2 или b=2&a=1
>>(3 раз уже пишу)
ну, вообще-то парой мессаг назад ты говоришь, что уточнил задание,
freeek-у писал: "напиши готовую функцию. на входе шаблон и урл, на выходе кей. проверю отпишусь"...
сорри, что вмешался... удаляюсь... ctrl+alt+del

0
 



С нами с 16.10.09
Сообщения: 343
Рейтинг: 419

Ссылка на сообщениеДобавлено: 10/02/11 в 23:40       Ответить с цитатойцитата 

ююю

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 10/02/11 в 23:43       Ответить с цитатойцитата 

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

0
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 11/02/11 в 10:08       Ответить с цитатойцитата 

ibiz писал:
самое правильно решение в топике smail54.gif
если домен с www или без - и уже не работает, ровно как и при перестановке гет-переменных местами... icon_mad.gif я понимаю, коротко, красиво, но... имхо, не правильно не учитывать разные варианты...

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 11/02/11 в 14:02       Ответить с цитатойцитата 

что значит не работает

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

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

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

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

выведет
Код:
fuck

0
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 11/02/11 в 14:52       Ответить с цитатойцитата 

freeek писал:
что значит не работает
все работает, тут надо понимать о чем речь и абстрагироваться от урлов с домена и т.д.
вопрос был о урлах, а они бывают как с ввв, так и без. гугол бывает как ком, так и фр. и не обязательно, что после ы=кей&з=12 "з" всегда будет 12? а вдруг 24? вылет...
но в рамках жесткого шаблона - да, твое решение изящно smail54.gif

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 11/02/11 в 15:07       Ответить с цитатойцитата 

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

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

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

0
 



С нами с 03.02.09
Сообщения: 139
Рейтинг: 235

Ссылка на сообщениеДобавлено: 12/02/11 в 20:07       Ответить с цитатойцитата 

сперва
http://php.net/manual/en/function.parse-url.php
потом
http://www.php.net/manual/en/function.parse-str.php
на выходе ассоциативный массив вида ключ-значение

0
 



С нами с 20.02.06
Сообщения: 248
Рейтинг: 366

Ссылка на сообщениеДобавлено: 13/02/11 в 21:03       Ответить с цитатойцитата 

iRoot: именно такое решение я и предлодил на предыдущей странице

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 13/02/11 в 21:52       Ответить с цитатойцитата 

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

не знаю конечно для чего это и где это применяется, но по факту так и есть

0
 



С нами с 20.02.06
Сообщения: 248
Рейтинг: 366

Ссылка на сообщениеДобавлено: 14/02/11 в 20:38       Ответить с цитатойцитата 

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

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

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

Последний раз редактировалось: CABMIT (14/02/11 в 20:46), всего редактировалось 1 раз

0
 



С нами с 20.02.06
Сообщения: 248
Рейтинг: 366

Ссылка на сообщениеДобавлено: 14/02/11 в 20:45       Ответить с цитатойцитата 

Код:
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

0
 



С нами с 09.10.07
Сообщения: 433
Рейтинг: 321

Ссылка на сообщениеДобавлено: 14/02/11 в 21:24       Ответить с цитатойцитата 

Кстати последний вариант решения _точно_ соотвествует ТЗ ;)

PS Впрочем сам бы я предпочел все таки решение с urlparse, и отдельной обработкой случаев когда {KEY} в пути/домене, или когда {KEY} -- весь query_string (то есть случай domain.com/?{key}) -- будет немного более громоздко, зато более понятно, предсказуемо и поддерживаемо)

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 15/02/11 в 03:23       Ответить с цитатойцитата 

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

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »