Помогите написать небольшой скрипт

Тема в разделе "PHP", создана пользователем Uglik, 21 дек 2010.

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

    Uglik

    Регистр.:
    8 окт 2008
    Сообщения:
    350
    Симпатии:
    14
    Здравствуйте

    Помогите реализвать такую задачу:
    Есть текстовый файл состоящий из строк текстовых и ссылок. Нужно вытащить все строки с сылками и сложить в отлельные файл в чистом виде. Пример:
    HTML:
    
    http://www.domen.ru
    текст
    текст
    текст
    http://www.domen.ru
    http://www.domen.ru
    текст
    
    Как я понимаю нужно что бы находило строки содержащие "http://" и копировало их в отдельный файл

    За ранее благодарю
     
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    144
    Симпатии:
    107
  3. Uglik

    Uglik

    Регистр.:
    8 окт 2008
    Сообщения:
    350
    Симпатии:
    14
    Я в php вообще не волоку .... можешь подсказать что именно подправить нужно

    PHP:
    function to_write($way$data$e) {
        
    $hf fopen($way$e);
              
    flock($hfLOCK_EX);
              
    fputs($hf$data);
              
    flock($hfLOCK_UN);
              
    fclose($hf);
    }
    $urls file('urls.txt'); // каждый урл с новой строки
       
    $c count($urls);
        for(
    $i=0$i $c$i++ ) {
           
    $content = @file_get_contents(trim($urls[$i]));
             if (
    strpos($content'да покупаю') !== false) {
                  
    to_write('file-1.txt'$urls[$i], 'w+');
             } else {
                  
    to_write('file-2.txt'$urls[$i], 'w+');
             }
       } 
     
  4. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    примерно так
    PHP:
    <?php
    $urls 
    file('urls.txt'); // каждый урл с новой строки 
       
    $c count($urls); 
       echo 
    $c;
        for(
    $i=0$i $c$i++ ) { 
               
    preg_match_all('/http:\/\//',$urls[$i],$str);
               
    // print_r($str[0][0]);             
             
    if (isset($str[0][0])) { 
                  
    // echo 'линк';
                   
    $fp1=fopen('links.txt''a');
                   
    fwrite($fp1,$urls[$i]);
                } else { 
                  
    // echo 'текст';
                  
    $fp2=fopen('text.txt''a');
                   
    fwrite($fp2,$urls[$i]); 
             } 
       }
    fclose($fp1);
    fclose($fp2);
    ?>
     
    Uglik нравится это.
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.402
    Симпатии:
    1.182
    Вот так будет в разы быстрее работать:
    PHP:
    <?php 
    $urls 
    file('urls.txt'); // каждый урл с новой строки
        
    $c count($urls);
        echo 
    "Строк:" $c;
        
    $fp1=fopen('links5.txt''a'); 
        
    //$fp2=fopen('text5.txt', 'a'); 
        
    for($i=0$i $c$i++ ) {
            if(
    strstr($urls[$i],'http://')) {
                
    fwrite($fp1,$urls[$i]); 
            } 
            
    //else { fwrite($fp2,$urls[$i]); }
        
    }
    fclose($fp1); 
    //fclose($fp2); 
    ?>
    А код выше - это ужас ужасный...
    Использовать preg_match_all для строки чтобы урвать только первый результат - глупость несусветная.
    А открытие указателя на файл в цикле - нет слов!
    Похоже на то, что тот, кто писал код выше, хотел значительно замедлить конкурентов...

    PS: может пригодиться код для удаления дублей доменов https://nulled.cc/showthread.php?t=198732
     
    Uglik нравится это.
  6. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    И при этом еще fclose используется только раз после цикла :)
    Да уж, жестокий код, интересно что будет с сервером если в файле 1000000 строк?
    Да и вообще твой вариант не так хорош как кажется, file для больших файлов не есть гуд.
    PHP:
    $f fopen('file.txt''r');
    $fp fopen('links.txt''a');
    while (!
    feof($f)){
        
    $l fgets($f);
        if (
    preg_match('|http|isu'$l)){
            
    fputs($fp$l);
        }
    }
    fclose($f);
    fclose($fp);
     
    latteo и zzallexx нравится это.
  7. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    latteo любят у нас попинать :-] Извини не волшебник а только учусь. по поводу
    да действительно тупанул, а вот насчет регуляркой или strstr (да просто регулярка первой на ум пришла)
    PHP:
    <?php
    $start1
    =gettimeofday();
    $urls file('urls.txt'); // каждый урл с новой строки 
       
    $c count($urls); 
       
    //echo $c;
       
    $fp1=fopen('links.txt''a');
       
    $fp2=fopen('text.txt''a');
        for(
    $i=0$i $c$i++ ) { 
                 
    preg_match('/http:\/\//',$urls[$i],$str);
                
    //print_r($str[0]);             
               
    if (isset($str[0])) 
             
    // if(strstr($urls[$i],'http://'))
              

                   
    //echo 'линк';
                   
    fwrite($fp1,$urls[$i]);
                } else { 
                   
    //echo 'текст';
                  
    fwrite($fp2,$urls[$i]); 
             } 
       }
    fclose($fp1); 
    fclose($fp2);
    $end1=gettimeofday();
    $totaltime1 = (float)($end1['sec'] - $start1['sec']) + ((float)($end1['usec'] - $start1['usec'])/1000000);

    echo 
    "Время выполнения скрипта: ".$totaltime1;
    ?>   
    Эксперемент:
    в url.txt 100 строк
    результат с регуляркой : Время выполнения скрипта: 0.0057912
    результат с strstr : Время выполнения скрипта: 0.004777
    тут ты прав конкуренты дышат в затылок :-]
     
  8. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    zzallexx, объясни плиз зачем тут preg_match_all?
     
  9. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Просто он скопировал чей-то код и не знает как работает ф-я preg_match_all
     
  10. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    я же написал
    конечно можно и preg_match :)
    не чей-то а свой :) см. выше сначало скопировал потом вставил copy-paste

    PS: Кстати c preg_match мой выриант получилось минимальное Время выполнения скрипта: 0.008677
    Вариант a_n_d_y минимальное Время выполнения скрипта: 0.003483
     
Статус темы:
Закрыта.