Как найти строку в текстовом файле, начинающуюся с 5678, и заменить ее ничем, используя php? - PullRequest
1 голос
/ 23 февраля 2011

Допустим, текстовый файл содержит:

56715:Jim:12/22/10:19  
5678:Sara:9/04/08:92    
53676:Mark:12/19/10:6  
56797:Mike:12/04/10:123  
5678:Sara:12/09/10:49  
56479:Sammy:12/12/10:645  
56580:Martha:12/19/10:952  

Я хотел бы найти строки, начинающиеся с "5678", и заменить их ничем, поэтому теперь файл будет содержать только:

56715:Jim:12/22/10:19  
53676:Mark:12/19/10:6  
56797:Mike:12/04/10:123  
56479:Sammy:12/12/10:645  
56580:Martha:12/19/10:952 

Спасибо.

Ответы [ 4 ]

3 голосов
/ 23 февраля 2011

Ну, просто используйте preg_replace:

$data = file_get_contents($filename);
$data = preg_replace('/^5678.*(\n|$)/m', '', $data);

Обратите внимание на модификатор m. Это переводит PCRE в многострочный режим, где ^ соответствует началу документа и после любого символа новой строки (и $ соответствует концу документа и перед любым символом новой строки) ...

Кроме того, в зависимости от ваших точных потребностей вы можете создать потоковый фильтр :

class LineStartFilter extends php_user_filter {
    protected $data = '';
    protected $regex = '//';
    public function filter($in, $out, &$consumed, $closing) {
        var_dump($this->regex);
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace($this->regex, '', $bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
    public function onCreate() {
        list($prefix, $data) = explode('.', $this->filtername);
        $this->data = $data;
        $this->regex = '/^'.preg_quote($data, '/').'.*(\n|$)/m';
    }
}
stream_filter_register('linestartfilter.*', 'LineStartFilter');

Тогда просто сделайте это, когда хотите прочитать файл:

$f = fopen('test.txt', 'r');
stream_filter_append($f, 'linestartfilter.5678');
fpassthru($f);
fclose($f);

Это выведет вашу запрошенную строку. И если вы хотите записать в другой файл (скопируйте его):

$f = fopen('test.txt', 'r');
stream_filter_append($f, 'linestartfilter.5678');
$dest = fopen('destination.txt', 'w');
stream_copy_to_stream($f, $dest);
fclose($f);
fclose($dest);
3 голосов
/ 23 февраля 2011
// The filename
$filename = 'filename.txt';

// Stores each line into an array item
$array = file($filename);

// Function to return true when a line does not start with 5678
function filter_start($item)
{
   return !preg_match('/^5678:/', $item);
}

// Runs the array through the filter function
$new_array = array_filter($array, 'filter_start');

// Writes the changes back to the file
file_put_contents($filename, implode($new_array));
2 голосов
/ 23 февраля 2011

Тим Купер просто напомнил мне что file() делает:)

$lines = file($filename);

$lines = preg_grep('/^5678/', $lines, PREG_GREP_INVERT);

$file = implode($lines);

file_put_contents($filename, $file);
2 голосов
/ 23 февраля 2011

preg_replace('~5678:[^\n]+?\n~', '', $text);

Если ваш текст заканчивается на \n, в противном случае сначала преобразуйте окончания строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...