1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Вставить функцию транслита

Тема в разделе "Web Coding", создана пользователем dig555, 19 янв 2008.

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

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Есть парсер яндекса
    PHP:
    <?php

    $keyword
    ="жопа";

    $url="http://wordstat.yandex.ru/advq?rpt=ppc&key=&shw=1&tm=&checkboxes=&text=".urlencode($keyword)."&regions_text=%C2%F1%E5&regions=";

    $done=false;


    while(!
    $done)
    {
       
    sleep(rand(5,15));

       
    $ch=curl_init($url);
       
    curl_setopt($chCURLOPT_HEADER0);
       
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
       
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
       
    curl_setopt($chCURLOPT_CONNECTTIMEOUT15);
       
    curl_setopt($chCURLOPT_TIMEOUT15);
       
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
       
    curl_setopt($chCURLOPT_REFERER"http://yandex.ru");
       
    $content=curl_exec($ch);
       
    curl_close($ch);

       
    $pos=strpos($content"Что еще");
       if (
    $pos !== false)
       {
          
    $content=substr($content,0,$pos);
       }

       
    $r=preg_match_all('/tm=">([а-я[:print:][:cntrl:]]*?)<\/a><\/td>/i',$content,$matches);

       
    # print $r;


       
    $buf="";

       for(
    $i=0$i<$r$i++)
       {
          
    # print $matches[1][$i]."\n";
          
    $buf.=$matches[1][$i]."\n";
       }

       
    $fp=fopen("words.txt","a+");
       
    fwrite($fp,$buf,strlen($buf));
       
    fflush($fp);
       
    fclose($fp);

       if (
    preg_match('/] <a href="(\/advq[[:cntrl:][:print:]]*?)">следующая/',$content,$pocket))
       {
          
    $url="http://wordstat.yandex.ru".str_replace("&amp;","&",$pocket[1]);

       }
       else
       
    $done=true;

    }
    ?>
    Напарсенное по запросу $keyword он сохраняет в файл words.txt.
    Есть функция транслита, открученная от одного доргена.
    PHP:
    function translit($cyr_str) {
        
    $razd="-";
        
    $cyr_str=strtolower($cyr_str);
        
    $tr =  array("А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        
    "Д"=>"d","Е"=>"e","Ж"=>"zh","З"=>"z","И"=>"i",
        
    "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        
    "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        
    "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"c","Ч"=>"ch",
        
    "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"y","Ь"=>"",
        
    "Э"=>"e","Ю"=>"u","Я"=>"ya","а"=>"a","б"=>"b",
        
    "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
        
    "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        
    "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        
    "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        
    "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"",
        
    "ы"=>"y","ь"=>"","э"=>"e","ю"=>"u","я"=>"ya"" " => $razd);
        
    $textstrtr($cyr_str$tr);
        
    $text=preg_replace("/[^a-z0-9_ -]*/"""$text);
            return 
    $text;
    }
    Помогите, пожалуйста, заставить парсер сохранять итог своей работы в файл с именем "транслит слова из $keyword".txt
     
  2. Flock

    Flock Постоялец

    Регистр.:
    16 июн 2007
    Сообщения:
    142
    Симпатии:
    44
    вот это
    PHP:
    $fp=fopen("words.txt","a+");
    Замени на
    PHP:
    $fp=fopen(translit(urldecode($keyword))."txt","w+");
     
    dig555 нравится это.
  3. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    спасибо. всё оказалось проще чем я думал. только заменил не на
    PHP:
    $fp=fopen(translit(urldecode($keyword))."txt","w+"); 
    а на
    PHP:
    $fp=fopen(translit(urldecode($keyword)).".txt","w+"); 


    Добавлено через 16 минут
    а вот такой вопрос. недавно поднимал тему об очистке файла с кеями. Вот её итог.
    http://www.nulled.ws/showpost.php?p=337227&postcount=17

    помогите пожалуйста соединить этот парсер с чистильщиком кеев. Чтобы в файл сохранялись уже очищенные кеи.
    парсер:
    PHP:
    <?php

    $keyword
    ="разум";

    $url="http://wordstat.yandex.ru/advq?rpt=ppc&key=&shw=1&tm=&checkboxes=&text=".urlencode($keyword)."&regions_text=%C2%F1%E5&regions=";

    $done=false;

    function 
    translit($cyr_str) {
        
    $razd="-";
        
    $cyr_str=strtolower($cyr_str);
        
    $tr =  array("А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        
    "Д"=>"d","Е"=>"e","Ж"=>"zh","З"=>"z","И"=>"i",
        
    "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        
    "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        
    "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"c","Ч"=>"ch",
        
    "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"y","Ь"=>"",
        
    "Э"=>"e","Ю"=>"u","Я"=>"ya","а"=>"a","б"=>"b",
        
    "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
        
    "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        
    "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        
    "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        
    "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"",
        
    "ы"=>"y","ь"=>"","э"=>"e","ю"=>"u","я"=>"ya"" " => $razd);
        
    $textstrtr($cyr_str$tr);
        
    $text=preg_replace("/[^a-z0-9_ -]*/"""$text);
            return 
    $text;
    }



    while(!
    $done)
    {
       
    sleep(rand(5,15));

       
    $ch=curl_init($url);
       
    curl_setopt($chCURLOPT_HEADER0);
       
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
       
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
       
    curl_setopt($chCURLOPT_CONNECTTIMEOUT15);
       
    curl_setopt($chCURLOPT_TIMEOUT15); 
       
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
       
    curl_setopt($chCURLOPT_REFERER"http://yandex.ru");
       
    $content=curl_exec($ch);
       
    curl_close($ch);

       
    $pos=strpos($content"Что еще");
       if (
    $pos !== false)
       {
          
    $content=substr($content,0,$pos);
       }

       
    $r=preg_match_all('/tm=">([а-я[:print:][:cntrl:]]*?)<\/a><\/td>/i',$content,$matches);

       
    # print $r;


       
    $buf="";

       for(
    $i=0$i<$r$i++)
       {
          
    # print $matches[1][$i]."\n";
          
    $buf.=$matches[1][$i]."\n";
       }

       
    $fp=fopen(translit(urldecode($keyword)).".txt","w+");
       
    fwrite($fp,$buf,strlen($buf));
       
    fflush($fp);
       
    fclose($fp);

       if (
    preg_match('/] <a href="(\/advq[[:cntrl:][:print:]]*?)">следующая/',$content,$pocket))
       {
          
    $url="http://wordstat.yandex.ru".str_replace("&amp;","&",$pocket[1]);

       }
       else
       
    $done=true;

    }

    ?>
    чистильщик:
    PHP:
    <?php 
       $filename
    ="file.txt";     //файл со строками 
       
    $lines=file($filename); 
       
    $bad="badwords.txt";   //плохие слова 
       
    $badwords=file($bad); 

       function 
    rulat($words) { 
          
    //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда 
          
    $rus = array( "А""а""В""Е""е""К""к""М""Н""О""о""Р""р""С""с""Т""Х""х"); 
          
    //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно 
          
    $eng = array("A""a""B""E""e""K""k""M""H""O""o""P""p""C""c""T""X""x"); 
          
    //Замена англ. букв русскими 
          
    return str_replace ($eng$rus$words); 
       } 

       foreach (
    $badwords as $k => $v) { 
       
    $badwords[$k] = trim($v); 
       } 

       
    $lines rulat($lines); 
       
    $badwords array_flip($badwords); 
       foreach (
    $lines as $v) { 
       
    $s trim(preg_replace('/([^a-zA-Zа-яА-Я]{1,})/',' ',$v)); 
       
    $s array_flip(explode(' ',$s)); 
       
    $is_ok true
       foreach (
    $s as $k => $fix) { 
       if (isset(
    $badwords[$k])) { 
       
    $is_ok false
       break; 
       } 
       } 
       if (
    $is_ok) { 
       echo 
    $v.'<br>'
       } 
       } 
    ?>
     
  4. Flock

    Flock Постоялец

    Регистр.:
    16 июн 2007
    Сообщения:
    142
    Симпатии:
    44
    В общем не совсем понял, примерно накидал:
    PHP:
    function rulat($words) {  
          
    //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда  
          
    $rus = array( "А""а""В""Е""е""К""к""М""Н""О""о""Р""р""С""с""Т""Х""х");   //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно  
          
    $eng = array("A""a""B""E""e""K""k""M""H""O""o""P""p""C""c""T""X""x");  //Замена англ. букв русскими  
          
    return str_replace ($eng$rus$words);  
    }  

    function 
    clearfunc($badwords,$lines)
    {
       foreach (
    $badwords as $k => $v) {  
       
    $badwords[$k] = trim($v);  
       }  

       
    $lines rulat($lines);  
       
    $badwords array_flip($badwords);  
       foreach (
    $lines as $v) {  
       
    $s trim(preg_replace('/([^a-zA-Zа-яА-Я]{1,})/',' ',$v));  
       
    $s array_flip(explode(' ',$s));  
       
    $is_ok true;  
       foreach (
    $s as $k => $fix) {  
       if (isset(
    $badwords[$k])) {  
       
    $is_ok false;  
       break;  
       }  
       }  
       if (
    $is_ok) {  
       echo 
    $v.'<br>';  
       }  
       }
        return 
    $s
    }
    Смысл приблизительно такой, преобразовать этот код в функцию, затем когда тебе нужно очистить, вызываешь ее и передаешь два массива, список плохих слов $badwords и $lines это массив с key`ями так? Эти функции в конец парсера дописать
     
    dig555 нравится это.
  5. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Спасибо большое, разобрался. Извиняюсь за наглость:ah: Предпоследний вопрос. В этом кусочке кода массив $buf записывается в файл.
    PHP:
       $n="500";

       
    $buf="";
       for(
    $i=0$i<$r$i++)
       {
          
    # print $matches[1][$i]."\n";
          
    $buf.=$matches[1][$i]."\n";
       }
       
    print_r($buf);
       
    $fp=fopen(translit(urldecode($keyword)).".txt","w+");
       
    fwrite($fp,$buf,strlen($buf));
       
    fflush($fp);
       
    fclose($fp);
    Как по записи в файл количества кеев указанных в $n, закрыть файл. Следующие $n кеев записать во второй файл, с именем "такое-же-как-и-у-первого2". Очередные $n в файл "такое-же-как-и-у-первого3". И так пока кеи не кончаться.
     

    Вложения:

    • last.php.txt
      Размер файла:
      4,7 КБ
      Просмотров:
      2
  6. Flock

    Flock Постоялец

    Регистр.:
    16 июн 2007
    Сообщения:
    142
    Симпатии:
    44
    PHP:
    function Write($your_array,$key_word,$n)
    {
    $var=0;$count=0;$size=count($your_array);

    while(
    $var $size)
    {

    for(
    $j=0;$j<$n;$j++)
    {
        
    $new_array[$j]=$your_array[$count++];
    }

    $fp=fopen($key_word."".($t++).".txt","w+");
    $str=implode("\n",$new_array);
    fwrite($fp,$str,strlen($str));
    fflush($fp);
    fclose($fp);
    $str="";

    if((
    $size-$var) <= 9)
    {
    $n=$size-$var;

    for(
    $j=0;$j<$n;$j++)
    {
        
    $new_array[$j]=$your_array[$count++];
    }

    $fp=fopen($key_word."".($t++).".txt","w+");    
    $str=implode("\n",$new_array);
    fwrite($fp,$str,strlen($str));
    fflush($fp);
    fclose($fp);
    break;
    }
        
    $var+=$n;
    }
    }
    Вот функция, передаешь ей что записывать, название файла и по сколько записывать.
     
    dig555 нравится это.
  7. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Выставил $n="100"; Почему-то у меня создаётся только 2 файла, даже при очень популярных запросах. И самое ужасное - в этих файлах с новой строки идёт каждая буква кея. Посмотрите, пожалуйста, в чём может быть проблема.
    Вот что имеется на текущий момент:
     

    Вложения:

    • parser.txt
      Размер файла:
      4,7 КБ
      Просмотров:
      6
  8. nopase

    nopase Создатель

    Регистр.:
    6 май 2007
    Сообщения:
    49
    Симпатии:
    22
    146, 151 и 156 строка:
    PHP:
    $buf="";
    ..........
    $buf.=$matches[1][$i]."\n";
    ..........
    write($buf,$key_word,$n);
    и определение функции вывода в файл (80 строка:(
    PHP:
    function write($your_array,$key_word,$n)
    Обрати внимание, что функции надо передавать массив, а ты передаешь строку. Отсюда, после каждого символа в файле перенос строки. Замени 146 и 151 строки на соответственно:
    PHP:
    $buf=array();
    ..........
    $buf[]=$matches[1][$i];
    Далее.
    Ты парсишь первые писят кеев, передаешь функции, она пишет в файл. Парсишь следующие, передаешь, она пишет снова в ТОТ ЖЕ файл. Функция между вызовами не помнит скока кеев она уже записала в какой файл. Поэтому надо сначала все кеи запихнуть в массив, а уж потом по выходу из цикла прохода по страницам отдать этот массив функции. То есть, сносишь нахрен 146 строку:
    PHP:
    //$buf=array();
    А строку 156:
    PHP:
    write($buf,$key_word,$n);
    выносишь за цикл:
    PHP:
    ...........
       }
       else
       
    $done=true;

    }
    write($buf,$key_word,$n);
    Еще нашел баг. 99 строка:
    PHP:
    if(($size-$var) <= 9)
    наверно подразумевалось:
    PHP:
    if(($size-$var) < $n)
    И еще tips'n'tricks:
    задержку со 122 строки:
    PHP:
    sleep(rand(5,15));
    лучше отнести в конец цикла, а точнее вовнутрь проверки в конце цикла, где определяется следующая страница и есть ли она вапще. Зачем же лишние 5-15 секунд ждать? ;)
     
    dig555 нравится это.
Статус темы:
Закрыта.