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
фига се простое
/.+[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мя десятками способов
Тащить целый пакерт чтобы разобрать конкретный пример? просто не мой метод
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
Да уж, задание сформулировано красиво
Ничего не понять.
цитата
10/02/11 в 08:26
_s_[sov]
ну если из выше показаного примера вытащит единицы то можно например и так
Код:
\?dd=(.*)\&
цитата
10/02/11 в 11:05
freeek
уточни условие, кей появляется самым первым, после домена?
цитата
10/02/11 в 11:21
taj
kodek писал:
Да уж, задание сформулировано красиво
Ничего не понять.
Вот с такими заказчиками и приходиться часто иметь дело.
Какой пример показал, для такого и подсказали. Телепатов как выяснилось тут нет )
По сабжу:
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 секунд, но просто люди не могут понять что ты хочешь
цитата
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
>
последняя »
Новая тема
Ответить
Эта страница в полной версии