Разбор адресной строки

imdem

Guest
Разбор и перекодировка адресной строки

Собственно интересно получить поисковые слова из адресной строки
Например
http://www.yandex.ru/yandsearch?text=%D0%E5%F4%E5%F0%E0%F2+%C0%F2%E5%F0%EE%F1%EA%EB%E5%F0%EE%E7+%E0%F0%F2%E5%F0%E8%E9+-+%ED%E0%F1%F2%F3%EF%EB%E5%ED%E8%E5+%ED%E0+%E7%E4%EE%F0%EE%E2%FC%E5&stype=www

то есть получить фразу "Реферат Атеросклероз артерий - наступление на здоровье" - которая тут содержится

Хотя в этом случае как раз могу справиться)) - вырежу все что начинается после %, переведу в десятичный, использую chr() и тд.



НО.
1. Хочется более простого решения).
2. Есть варианты которые я не знаю как преобразовать - например

http://www.yandex.ru/yandpage?q=1454583024&p=12&ag=d&qs=text=%D0%CF%CB%D5%D0%C1%C5%CD+%CD%C1%D3%CC%C1+%C9%CE%C4%D5%D3%D4%D2%C9%C1%CC%D8%CE%D9%C5&stype=www

тут текст "покупаем масла индустриальные"

то есть получить %25DO - я могу - но как это преобразовать в текст -не знаю(((

ps упомянутые мною строки ,которые надо разбирать - имеются у меня именно в виде таких строк...а не в виде адресной строки)
 

tony2001

TeaM PHPClub
PHP:
parse_str("text=%D0%E5%F4%E5%F0%E0%F2+%C0%F2%E5%F0%EE%F1%EA%EB%E5%F0%EE%E7+%E0%F0%F2%E5%F0%E8%E9+-+%ED%E0%F1%F2%F3%EF%EB%E5%ED%E8%E5+%ED%E0+%E7%E4%EE%F0%EE%E2%FC%E5&stype=www", &$arr);
var_dump($arr);
 

imdem

Guest
это не совсем то что мне надо((...ну или так...это первая часть задачи решение которой у меня не вызывает затрудения))
да...я получу в результате содержимое переменной text.

меня интересует как проще преобразовать текст вида %ED или %25ED в обычную кодировку
 

imdem

Guest
iconv - это немножко не то...или я не знаю к какой кодировке относится "%EF" ))

urldecode ближе к истине (я уже с ним бился)...но он умеет обрабатывать только 2значные закодированные символы...то есть типа %xx

а во втором примере (см первый пост) встречаются выражения типа %25xx - то есть%xxxx и их urldecode рабирать не умеет(((
 

SiMM

Новичок
Автор оригинала: imdem
urldecode ближе к истине (я уже с ним бился)...но он умеет обрабатывать только 2значные закодированные символы...то есть типа %xx
Разве parse_str делает не то же самое?
 

imdem

Guest
parse_str - он парсит строку - ...ну делит ее на массив переменных..
то есть после использования этой функции я получу без геморроя содержимое переменной text...но при этом не получу ее декодировку.

ок...следущий шаг - использую urldecode или rawurldecode - для первой приведенной мной строки все идет на ура(там двузначное кодлирование типа %xx)...но не для второй - где четырехзначное типа %xxxx


а вот как победить вторую строку - это и есть самый основной вопрос данного топика)
 

SiMM

Новичок
PHP:
$str = 'text%3D%25D0%25CF%25CB%25D5%25D0%25C1%25C5%25CD%2B%25CD%25C1%25D3%25CC%25C1%2B%25C9%25CE%25C4%25D5%25D3%25D4%25D2%25C9%25C1%25CC%25D8%25CE%25D9%25C5%26stype%3Dwww';
echo preg_replace('/%(?:25)?([0-9a-f]{2})/sei','chr(hexdec("$1"))',$str);
 

imdem

Guest
да это то что надо)

вопрос - не сильно влом объяснить как действует замена регулярных выражений в данном случае? - а то у меня по ним вобще пробел... - ну прямо построчно...типа
(?:25) - первая маска и т.д.))))

если влом - то не обижусь - пойду читать доку)
 

SiMM

Новичок
imdem, доку читай по любому. [m]PCRE[/m], Регулярные выражения, часть I + часть II. О кодировке Unicode (UTF-16) можно почитать здесь или в гугле.
Действует всё довольно просто - ищем подстроки, начинающиеся с %, после которых может быть последовательность 25, а может и не быть (на это указываеть ? после скобки). В принципе, можно было обойтись и без (?:...) - даже не знаю, как объяснить действие этого оператора понятно :) В общем, этот приём используется, когда на содержимое скобок нет необходимости ссылаться.
Далее всё ещё проще - после вышесказанного ожидается ещё две шестнадцатеричные цифры.
Модификатор s, возможно, в данном случае избыточен (просто привычка), его значение посмотришь в мане. Используется он, когда поиск осуществляется в многострочных текстах.
Модификатор i позволяет неразличать регистра букв (возможно, в данном случае он тоже нежелателен - тогда стоит переписать содержимое регулярника с указанием больших букв латиницы).
Модификатор e - самое интересное в этом регулярнике - позволяет не просто произвести замену, а произвести замену на результат вычисления последующего выражения ([m]chr[/m]([m]hexdec[/m](то, что подхватили при помощи ([0-9a-f]{2})))). Как видишь, всё не так уж и сложно.
 

imdem

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

SiMM

Новичок
Фанат, можно, конечно, и без них было решить поставленную задачу - только, имхо, регулярники в данном случае против любого другого решения выглядят гораздо красивее :)
PS: или есть способ проще?
 

Фанат

oncle terrible
Команда форума
Способ чего?
Я не пойму, в чем задача-то состоит?
4 символа - это что за кодировка?
 

Фанат

oncle terrible
Команда форума
imdem
чтобы что-то предложить, надо сначала знать, в чем проблема.
 

SiMM

Новичок
Unicode походу (правда, какая-то странная кодировка... раскусил эмпирически ;) ). URL-кодированный. А тема топика, имхо, не соответствует содержанию, т.е. изначально вопрос был поставлен неверно - проблема была не в этом.
 

imdem

Guest
Originally posted by tony2001
кто-нибудь мой код попробовал выполнить вообще?
результат
array(1) { ["text=%D0%CF%CB%D5%D0%C1%C5%CD+%CD%C1%D3%CC%C1+%C9%CE%C4%D5%D3%D4%D2%C9%C1%CC%D8%CE%D9%C5&stype=www"]=> string(0) "" }
 
Сверху