Xpoint
   [напомнить пароль]

Регулярные выражения, разбор запроса

Метки: [без меток]
2007-12-06 11:49:22 [обр] D.A.Y[досье]

Доброе день!
у меня есть вопрос, на который ответ я так и не смог найти.

Полурные поисковики имееют следующие перменные:

передаваемый текст:
Яндекс = text
Гугл, MSN/Live = q
Рамблер = words
Yahoo = p

К примеру запрос простой, с яндекса.

text=Нужный мне текст&rstr=-54&rstr_manually=true

Но есть и подводный камень с Yahoo:
p=Нужный мне текст&y=Искать&fr=FP-tab-web-t&rd=r1

У Yahoo P - запрос, а у яндекса в тоже время есть такая же переменная, но это страница.
&p=2&text=нужный мне текст&rpt=rad

Как разобрать запрос поисковика, вытащить только текст запроса, отбрасывая все лишнее?

спустя 48 минут [обр] Алексей Севрюков(162/1280)[досье]
D.A.Y[досье] А в чем проблема? Вы не можете под каждый поисковик задать свой формат и подставлять запрос?
спустя 1 минуту [обр] D.A.Y[досье]
Да, в этом проблема. Я не понимаю как сделать шаблон :(
Сколько не пытался читать, мало, что понимаю в PCRE
спустя 4 минуты [обр] Алексей Севрюков(162/1280)[досье]

D.A.Y[досье] Да очень просто. Делаем шаблон вида:

$yandex="text=%query&rstr=-54&..."
$yahoo="p=%query&...";

Берем мануал по str_replace и вперед:

$yandex=str_replace("%query", $query, $yandex);

где - $query - переменная, содержащая запрос.

спустя 4 минуты [обр] D.A.Y[досье]

а зачем мне str_replace?

$str = 'text=Нужный мне текст&rstr=-54&rstr_manually=true';
preg_match_all("/text=(.*)/", $str, $out);
print $out[1][0];

Нужный мне текст&rstr=-54&rstr_manually=true

а как после текста, после & все отрезать?

спустя 12 минут [обр] Dennis F. Latypoff aka funky_dennis(4/78)[досье]
/[&?;]text=(.*?)([&;]|$)/
спустя 1 минуту [обр] Алексей Севрюков(162/1280)[досье]

D.A.Y[досье] Ааа, так Вам не составить запрос надо, а вырезать его из QUERY_STRING. Прошу прощения, перепутал. Для разбора подобных вещей самый простой и классический вариант - split по &, затем split всех полученных результатов по = с одновременным сохранением в хэш.

Dennis F. Latypoff aka funky_dennis[досье] ну или так )

спустя 4 минуты [обр] D.A.Y[досье]

preg_match_all("/[&?;]text=(.*?)([&;]|$)/", $str, $out);

array(3) {
  [0]=>
  array(0) {
  }
  [1]=>
  array(0) {
  }
  [2]=>
  array(0) {
  }
}

;(

всё такая же строка. Вот чесслово, слабодоходит до меня PCRE...

спустя 10 минут [обр] Dennis F. Latypoff aka funky_dennis(4/78)[досье]
я PHP не знаю, но у меня вот такое в Perl работает уже давно:
$referer = 'http://www.yandex.ru/yandsearch?text=pcre';
$query = 'text=';

($phrase) = $referer =~ m![&?;]\Q$query\E(.*?)([&;]|$)!g;
спустя 24 минуты [обр] Jimi Dini(9/9)[досье]
$string = 'text=Нужный мне текст&rstr=-54&rstr_manually=true';

mb_regex_encoding('utf-8');
$res = mb_ereg_replace('(.*text=)([^&]*)(.*)', '\\2', $string);
спустя 2 минуты [обр] Jimi Dini(9/9)[досье]
Само собой, вместо utf-8 можно подставить то что вам нужно (CP1251, KOI8-R, и т.п.)
спустя 1 час 26 минут [обр] Александр Галкин(112/211)[досье]
D.A.Y[досье]
Регулярные выражения здесь не нужны. Используйте функции parse_url и parse_str.
спустя 3 дня [обр] GasheK[досье]
Сервис для проверки регулярных выражений:
http://regexpr.ru/
Powered by POEM™ Engine Copyright © 2002-2005