Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Регулярные выражения. Вопрос к знатокам (отредактировал)
Новая тема
Ответить
цитата
10/02/11 в 14:06
wdfrretevw
CABMIT писал:
ТС, ты можешь чётко и ясно сформулировать задачу? Что есть на входе и что должно получиться на выходе? Чётко сформулированная задача - это уже половина решения. Я уверен, что задача тут на 10 секунд, но просто люди не могут понять что ты хочешь
на входе есть шаблоны и урлы
ШАБЛОНЫ
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
моя рега бьет все твои примеры
что еще надо
цитата
10/02/11 в 14:22
wdfrretevw
freeek писал:
моя рега бьет все твои примеры
что еще надо
напиши готовую функцию. на входе шаблон и урл, на выходе кей. проверю отпишусь
цитата
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
если наш кей может появиться хуй знает где и как я понял на это самое "хуй знает есть шаблон, то рега не нужна, на первый взляд разовать урл по границе кея в шаблоне
блеать
, торопомотрел,
в результате есть одно НО, регу уместо использвать когда тот самый вариант, с ?key или ?name=key
если наш кей может появиться хуй знает где и как я понял на это самое "хуй знает" есть шаблон, то рега не нужна, на первый взляд разовать урл по границе кея в шаблоне
блеать
, тороплюсь, времени нет проверять, но если надо так то можно сделать и так
ничего невозможного нет
цитата
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>';
короче вот, условие, что шаблон строго соответсвует той строке где ищем
все убегаю
цитата
10/02/11 в 17:12
AWD
на
может кривовато, как для истинных мастеров и любителей классов, функций и регулярок, зато работает.
$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>';
короче вот, условие, что шаблон строго соответсвует той строке где ищем
все убегаю
хорошее решение - но не проверил, щас лень, завтра уже. Всем 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>';
короче вот, условие, что шаблон строго соответсвует той строке где ищем
все убегаю
самое правильно решение в топике
цитата
11/02/11 в 10:08
AWD
ibiz писал:
самое правильно решение в топике
если домен с www или без - и уже не работает, ровно как и при перестановке гет-переменных местами...
я понимаю, коротко, красиво, но... имхо, не правильно не учитывать разные варианты...
цитата
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? вылет...
но в рамках жесткого шаблона - да, твое решение изящно
цитата
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
Тогда просто надо составить список символов, из которых может состять кей, и ограничителей.
Не уверен, что эта задача решается в общем случае, либо необходимы уточнения.
ТС, не обращай внимания на то что мы тут пишем. Мы в курсе, что ты уже нашёл решение, у нас просто спортивный интерес
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
цитата
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
да неплохо, только зачем
смысл то не меняется, зачем использовать реги там где можно обойтись без них
логика моей функции простая, кей находиться в том месте, где указана метка в шаблоне
чтоб его извлечь, надо обрезать строку по границам этой метки и мы получим то что искали
в твоем случае, мы ищем вхождение первой подмаски, описывающей метку, под которой лежит сам кей
по сути одно и тоже, ну может чуть чуть помедленнее
Стр.
« первая
<
1
,
2
,
3
>
последняя »
Новая тема
Ответить
Эта страница в полной версии