Регулярка для автозаполнения Яндекса

Тема в разделе "Регулярные выражения", создана пользователем Albert22, 27 мар 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Всем привет
    Хочу уворовать автокомплит от Яндекса.
    Вот что имеется:
    Перейти по ссылке
    (vk — уже введенные символы, по которым и производится автозаполнение)
    Яндекс возвращает:
    А вот как нужно передать это же работающему у меня Перейти по ссылке:
    Я напыхтел вот такой скрипт:
    Код:
    <?php
    $file=file_get_contents("http://suggest.yandex.ru/suggest-ya.cgi?ct=text/html&part=".$_REQUEST['value']."&v=2");
    preg_match_all('#"([-_\w\s\d]{3,})"#i', $file, $matches);
    foreach($matches[0] as $key=>$val){
    if(!empty($val)){print '<li>'.$val.'</li>';}
    }
    ?>
    , возвращающий следующее:
    Вопрос даже не сколько в том, как убрать кавычки. Хотелось бы знать как максимально оптимизировать этот скрипт. Или, как обойтись без него — вскормить непосредственно Яндексовские предположения (без моих промежуточных стараний) этому Перейти по ссылке.
    Заранее спасибо.

    Добавлено через 5 минут
    UPD:
    Код:
    print '<li>'.str_replace('"', '', $val).'</li>';
    Пока работает так, однако что-то мне подсказывает что это — не самый лучший вариант.
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Если кртична скорость, то имеет смысл обойтись без регулярки, написать скрипт проходящий по строке. Из регулярок же думаю будет наиболее производительно "\K[^"]* - на вскидку, теста не проводил:) Еще зависит от того какие входные данные, если в строке могут содержатся кавычки, например "vk", то надо соответственно усложнить обработку.
     
  3. serg_g

    serg_g Создатель

    Регистр.:
    31 окт 2008
    Сообщения:
    35
    Симпатии:
    9
    вот так побыстрее должно работать

    HTML:
    
    $str=preg_replace('/^.+?\[([^\[]+)\].+$/','\1',$file);
    $matches=explode(',',$str);
    foreach($matches as $val)
    	print '<li>'.str_replace('"', '', $val).'</li>';
    
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Сомневаюсь. Сохраняющие скобки, плюс после регулярки еще строку дополнительно обрабатываем, зачем, уж лучше сразу одним кодом обойтись.
     
  5. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    Это же JSON!
    PHP:
    <?
    $temp='suggest.apply("vk", ["vkontakte.ru", "vkontakte", "vkontakte.ru вход", "vklife", "vko", "vkrugudruzei.ru", "vkontakt", "vkmusic", "vkontakte.ru регистрация", "vkon"])';

    $temp=strrchr($temp,"[");
    $temp=substr($temp,0,strpos($temp,"]"))."]";
    $temp=iconv("CP1251","UTF-8",$temp);//яша возвращает windows-1251, а JSON принимается в UTF-e только
    $arr=json_decode($temp);
    var_dump($arr);//здесь строки все в UTF.если надо перекодируйте обратно
    ?>
    посто, и со вкусом используем встроенные средства.
    на основе этого кода можно и другую выдачу в JSON распарсивать
     
    Albert22 и RolCom нравится это.
  6. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Alternator, спасибо. Вот что получилось на базе Вашего скрипта:
    PHP:
    <?php
    $file
    =file_get_contents("http://suggest.yandex.ru/suggest-ya.cgi?ct=text/html&part=".urlencode($_REQUEST['value'])."&v=2");
    $file=strrchr($file,"[");
    $file=substr($file,0,strpos($file,"]"))."]";
    $file=iconv("CP1251","UTF-8",$file);//яша возвращает windows-1251, а JSON принимается в UTF-e только
    $data=json_decode($file);
    header("Content-type: text/html; charset=utf-8");
    print_r($data); // там уже по ситуации
    ?>
     
Статус темы:
Закрыта.