Помогите пожалуйста с парсером DLE

Discussion in 'PHP' started by lambda88, 30 Jun 2009.

  1. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Я только начинаю разбираться в PHP, и вот решил довести до ума парсер DLE сайтов.
    У меня возникла такая проблема: не могу сделать вывод полного пути вместо /../ в новостях.
    Могу приложить код, если поможет делу. ;)
     
  2. Deathdreams

    Deathdreams Elder - Старейшина

    Joined:
    8 Nov 2008
    Messages:
    342
    Likes Received:
    116
    Reputations:
    5
    конечно поможет,на словах трудно разобраться.
    выкладывай сорс
     
  3. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Все спасибо!!! Сделал!!!
    Кто нибудь знает как сделать что бы парсер распозновал [thumb]?
     
    #3 lambda88, 30 Jun 2009
    Last edited: 30 Jun 2009
  4. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Прилагаю код парсера с выводом полного пути

    PHP:
    <?php

    function myReadFile($url) {
        global 
    $cookie_file;
      
    $ch=curl_init($url);
      
    curl_setopt($ch,CURLOPT_RETURNTRANSFER1);
      
    curl_setopt($ch,CURLOPT_TIMEOUT,50);
      
    curl_setopt($ch,CURLOPT_HEADER,0);
      
    curl_setopt($ch,CURLOPT_REFERER,$url);
      
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0');
      
    curl_setopt($chCURLOPT_COOKIEFILE$cookie_file);
      
    curl_setopt($chCURLOPT_COOKIEJAR$cookie_file);
      
    $contents=curl_exec($ch);
        
    //$contents = str_replace("\n","",$contents);
        //$contents = str_replace("\r","",$contents);
      //return 
      
    return $contents;
    }

    function 
    preg_match_dotall($in,$patern=null,$i=1){
     if(
    $patern !== null || !empty($in)){
      if(
    is_array($patern)){
       foreach(
    $patern as $subpatern){
         
    preg_match($subpatern,$in,$match);
         if(!empty(
    $match[$i]))
          return 
    trim($match[$i]); 
       }
      }
      else{
       
    preg_match($patern,$in,$match);
        if(!empty(
    $match[$i]))
          return 
    trim($match[$i]); 
      }
     }
    }

    function 
    fix_img($source,$patern,$path_to_save=null){
      if(
    $path_to_save==null)
       
    $path_to_save="../uploads/posts/"date("Y-m")."/";
     if(!
    file_exists($path_to_save)){
        if(!
    mkdir($path_to_save0777))
           return 
    $source;
     }        
     
    $adres=preg_match_dotall($source,$patern);
     
    $full_path_info=pathinfo($adres);

     if(
    strpos($full_path_info['basename'], '?'))
        list(
    $full_path_info['basename'],$query)=explode('?',$full_path_info['basename']);   

     if(!empty(
    $full_path_info['extension']))
        
    $full_path_info['basename']=str_ireplace(array('.php','.html','.php3','.htm','.asp','.jsp','.php4','.php5','.pl'),".jpeg",$full_path_info['basename']);
     
    else
      
    $full_path_info['basename']=$full_path_info['basename'].".jpeg";
      
    $fullpath=$path_to_save.$full_path_info['basename'];
      
    if(
    file_exists($fullpath))
         return 
    str_ireplace($adres,"http://gamevip.ru/uploads/posts/"date("Y-m")."/".$full_path_info['basename'],$source); 
      elseif(
    copy($adres,$fullpath))
    {
             if(
    filesize($fullpath) && filesize($fullpath)>0)
                return 
    str_ireplace($adres,"http://gamevip.ru/uploads/posts/"date("Y-m")."/".$full_path_info['basename'],$source);
             else
                return 
    $source;       
    }
      else
         return 
    $source;    
    }

    function 
    curl_redir_exec($ch) {
        global 
    $cookie_file;
      static 
    $curl_loops 0;
      static 
    $curl_max_loops 20;
      if (
    $curl_loops++ >= $curl_max_loops) {
          
    $curl_loops 0;
          return 
    FALSE;
      }
      
    curl_setopt($chCURLOPT_HEADERtrue);
      
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0'); 
        
    curl_setopt($chCURLOPT_COOKIEFILE$cookie_file);
      
    curl_setopt($chCURLOPT_COOKIEJAR$cookie_file);
      
    $data curl_exec($ch);
      list(
    $header$data) = explode("\n\n"$data2);
      
    $http_code curl_getinfo($chCURLINFO_HTTP_CODE);
      if (
    $http_code == 301 || $http_code == 302) {
        
    $matches = array();
        
    preg_match('/Location:(.*?)\n/'$header$matches);
        
    $url = @parse_url(trim(array_pop($matches)));
        if (!
    $url){
          
    //couldn't process the url to redirect to
          
    $curl_loops 0;
          return 
    $data;
        }
        
    $last_url parse_url(curl_getinfo($chCURLINFO_EFFECTIVE_URL));
        if (!
    $url['scheme']) $url['scheme'] = $last_url['scheme'];
        if (!
    $url['host']) $url['host'] = $last_url['host'];
        if (!
    $url['path']) $url['path'] = $last_url['path'];
        
    $new_url $url['scheme'] . '://' $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
        
    curl_setopt($chCURLOPT_URL$new_url);
            
    //debug('Redirecting to', $new_url);
        
    return curl_redir_exec($ch);
      } else {
        
    $curl_loops=0;
        return 
    $data;
      }
    }

    function 
    update_cookies($url$login$pass) {
        global 
    $cookie_file;
        
    $params = array();
        
    $params['login_name'] = $login;
        
    $params['login_password'] = $pass;
        
    $params['login'] = 'submit';
        
    $postdata = array();
        foreach (
    $params as $name => $value) {
        
    $postdata[] = $name.'='.$value;
      }
        
    $postdata implode('&'$postdata);
      
    $ch curl_init();
      
    curl_setopt($chCURLOPT_URL'http://'.$url.'/#');
      
    curl_setopt($chCURLOPT_HEADER0);
      
    curl_setopt($chCURLOPT_TIMEOUT50);
      
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
      
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
      
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
      
    curl_setopt($chCURLOPT_COOKIEFILE$cookie_file);
      
    curl_setopt($chCURLOPT_COOKIEJAR$cookie_file);
      
    curl_setopt($chCURLOPT_POST1);
      
    curl_setopt($chCURLOPT_POSTFIELDS$postdata);
      
    curl_exec($ch);
      unset(
    $ch);
    }

    function 
    transliteral ($qwer)  
    {  
          
    $NpjLettersFrom "абвгдезиклмнопрстуфцы";  
          
    $NpjLettersTo   "abvgdeziklmnoprstufcy";  
          
    $NpjBiLetters = array( "й" => "jj""ё" => "jo""ж" => "zh""х" => "kh""ч" => "ch",   
                                 
    "ш" => "sh""щ" => "shh""э" => "je""ю" => "ju""я" => "ja",  
                                 
    "ъ" => """ь" => "",);  

          
    $NpjCaps  "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯ";  
          
    $NpjSmall "абвгдеёжзийклмнопрстуфхцчшщьъыэюя";  

          
    $qwer str_replace(".php"""$qwer);  
          
    $qwer trim(strip_tags($qwer));  
          
    $qwer preg_replace"/\s+/ms""-"$qwer );  
          
    $qwer strtr$qwer$NpjCaps$NpjSmall );  
          
    $qwer strtr$qwer$NpjLettersFrom$NpjLettersTo );  
          
    $qwer strtr$qwer$NpjBiLetters );  

          
    $qwer preg_replace("/[^a-z0-9\_\-.]+/mi"""$qwer);  
          
    $qwer=preg_replace('#[\-]+#i''-'$qwer);  
          
    $qwer strtolower $qwer );  

          if (
    strlen($qwer) > 40) {  

            
    $qwer substr ($qwer040);  

                if ((
    $temp_max strrpos($qwer'-')))  $qwer substr ($qwer0$temp_max);  

          }  

      return 
    $qwer;  
    }  

    function 
    date_ ($date_in){
     if(!empty(
    $date_in)){
      
    $date_in=trim(strtolower($date_in));
      if(
    strpos($date_in',') && strpos($date_in':')){
        list(
    $data,$time)=explode(',',$date_in);
        
    $yes_todaydate("d")!==date("Y-m-d",mktime(0,0,0,date("m"),date("d")-1,date("Y"))) : date("Y-m-d",mktime(0,0,0,date("m")-1,0,date("Y"))) ;
        
    $data=strtr($data,array('cегодня'=>date("Y-m-d"),'вчера'=>$yes_today));
        return 
    "$data $time:00";  
      }
      else{
       
    $mount = array ('january'=>'01','february'=>'02','march'=>'03',
                          
    'april'=>'04','may'=>'05','june'=>'06',
                          
    'july'=>'07','august'=>'08','september'=>'09',
                          
    'october'=>'10','november'=>'11','december'=>'12',
                          
                          
    'jan'=>'01','feb'=>'02','mar'=>'03','apr'=>'04',
                          
    'jun'=>'06','jul'=>'07','aug'=>'08','sep'=>'09',
                          
    'oct'=>'10','nov'=>'11','dec'=>'12',
                          
                          
    'января'=>'01','февраля'=>'02','марта'=>'03',
                          
    'апреля'=>'04','мая'=>'05','июня'=>'06',
                          
    'июля'=>'07','августа'=>'08','сентября'=>'09',
                          
    'октября'=>'10','ноября'=>'11','декабря'=>'12',
                          
                          
    'янв'=>'01','фев'=>'02','мар'=>'03',
                          
    'апр'=>'04','июн'=>'06','июл'=>'07',
                          
    'авг'=>'08','сен'=>'09','окт'=>'10',
                          
    'ноя'=>'11','дек'=>'12');
                          
       
    $date_in=strtr($date_in,$mount);
       list(
    $data,$mount,$year)=explode(" ",$date_in);
       if(
    is_numeric($data) && is_numeric($data) && is_numeric($year)){
        return  
    date("Y-m-d H:i:s",mktime(rand(1,23),rand(1,59),0,$mount,$data,$year));    
       }
      }
     }
     else 
       return 
    date("Y-m-d H:i:s"); 
    }
    взять парсер можно из этой темы
     
  5. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Кто нибудь знает как сделать что бы парсер распозновал [thumb]? Очень надо!
     
  6. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Кста там в коде http://gamevip.ru/uploads/posts/ замените на свой сайт
     
  7. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Regular Expression
    И я думаю лучше бы всё перевести на регулярки, а не искать вхождения и парсить в ручную...
     
    #7 FireFenix, 30 Jun 2009
    Last edited: 30 Jun 2009
  8. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Я думаю надо собрать хороший парсер, многим новичкам может пригодиться, потомучто по- началу держать сайт одному очень тяжело, а так хоть контент будет
     
  9. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    По началу - новички должны читать мануалы.
    А те новички, которые пишут парсеры должны курить http://ua2.php.net/PCRE
     
  10. lambda88

    lambda88 New Member

    Joined:
    27 Jun 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Спасибо за помощь :mad: