[help] удаление строк которые не соответсвуют длине

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

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

    blackspy

    Регистр.:
    11 мар 2007
    Сообщения:
    415
    Симпатии:
    141
    Необходимо из файла удалить строки которые меньше 10 символов.
     
  2. x@nder

    x@nder Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    127
    Симпатии:
    5

    Тут тебе в помощь регулярные выражения

    $text=preg_replace("(\b((\S{0,10}))\b)", " ",$text );
     
    blackspy нравится это.
  3. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    253
    Симпатии:
    58
    Тогда не {0,10} а {0,9}.
    Кроме того для данного решения есть ограничение связанное с размером выделяемой php процессу оперативки, так как весь файл читается предварительно в память.

    Впрочем вполне можно тупо в цикле прочесть построчно файл с перезаписью в другой только строк длиной меньше 10 символов.
     
  4. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Пробел там точно лишний, думаю, не нужно объяснять почему :) :
    $text=preg_replace("(\b((\S{0,9}))\b)", "",$text );
     
    blackspy нравится это.
  5. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Вы хоть сами это выражение проверяли? Оно удалит все слова, с длинной меньше 10 символов.
    Правильное выражение вот:
    $text=preg_replace("/^.{0,9}$[\r\n]*/m", "",$text );
     
  6. x@nder

    x@nder Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    127
    Симпатии:
    5
    В общем то с замечаниями согласен.


    Хотя считаю что малость придираетесь.
    Писал навскидку.

    Не проверяя. Просто задава общую идею.
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Не придираюсь:) Но если разложить регулярку по косточкам, то:
    \b- означает начало и конец слова, а не строки
    ((\S{0,10})) -зачем сохраняюще скобки, тем более двойные, тем более здесь вообще не надо скобок.
    (\b((\S{0,10}))\b) - \S означает не пробел. В строке не может быть пробелов?
    Ну и надо захватить символы конца строки, иначе и правильное выражение просто очистит строку от символов, а не удалит, у меня [\r\n]*
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Эту задачу можно решить без всяких регулярок и будет в несколько раз быстрее.

    Простой пример
    PHP:
    <?php

    function test1() {
        
    $a[] = 'dgdfhfjfdjfjkfk';
        
    $a[] = '123455';
        
    $a[] = '12345678901';
        
    $a[] = 'fdhfh';
        
        for(
    $i 0$i count($a); ++$i)
            
    $a[$i]=preg_replace("/^.{0,9}$[\r\n]*/m""",$a[$i] );
    }

    function 
    test2() {
        
    $a[] = 'dgdfhfjfdjfjkfk';
        
    $a[] = '123455';
        
    $a[] = '12345678901';
        
    $a[] = 'fdhfh';
        
        
    $k count($a);
        for(
    $i 0$i <= $k; ++$i)
            if(!isset(
    $a[$i][10]))
               unset(
    $a[$i]);
    }

    test1();
    test2();

    ?>
    При 10 запусках профайлер показал, что функция test2() выполняется в 4-6 раз быстрее функции test1().

    Приспособить к задаче ТС - делов на 1 минуту.
     
  9. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Без регулярок, ясен перец может быстрей работать, но дольше в разработке. ТС как я понял нужен простой рабочий вариант, не обязательно PHP Перейти по ссылке

    З.Ы. Регулярку надо применять ко всему тексту, а не разбивать сначала на массив и проходить циклом, в котором надо просто проверить длинну элемента.
    test1() работает не правильно- просто заменяет элементы массива со строкой длинной<10 пустой строкой. Соответственно сравнение не корректно.

    З.Ы.2
    Итого будет 3 строки
    PHP:
    <?php
    $text 
    file_get_contents('file.txt');  
    $text preg_replace('/^.{0,9}$[\r\n]*/m'""$text);   
    file_put_contents('file.txt'$text);  
    ?>
     
  10. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Массив показан только для наглядности - никто не запрещает читать из файла построчно (хотя можно прочитать файл сразу же в массив), проверять как в test2() и по результатам либо выкидывать строку либо оставлять.

    test.txt
    Код:
    dgdfhfjfdjfjkfk
    123455
    12345678901
    qwertyui7
    PHP:
    <?php

    function test1() {
        
    $text file_get_contents('test.txt');
        
    $text preg_replace('/^.{0,9}$[\r\n]*/m'""$text);
        
    file_put_contents('file.txt'$text);
    }

    function 
    test2() {
        
    $a file('test.txt');

        
    $k count($a);
        for(
    $i 0$i $k; ++$i) {

            if(!isset(
    $a[$i][10]))
               unset(
    $a[$i]);
            else
               
    $a[$i] = str_replace("\r\n"''$a[$i]);
        }

        
    file_put_contents('file1.txt'implode("\r\n"$a));
    }

    for(
    $i 0$i 10; ++$i)
        
    test1();

    for(
    $i 0$i 10; ++$i)
        
    test2();

    ?>
    test1() - 66.83 мсек
    test2() - 49.12 мсек

    Чем test.txt будет больше, тем разница во времени будет существеннее.

    PS Если файл большой, то лучше читать построчно.
     
Статус темы:
Закрыта.