Удаление определенной строки из файла

Я столкнулся с этой проблемой при запуске веб-сайта wordpress. Я пробовал всевозможные вещи, чтобы исправить это, и не знал, как, в конечном счете, проблема была в том, что я использовал DNS-переадресацию с маскировкой, а ссылки на внешние сайты неправильно обрабатывались. т. е. мой сайт был размещен в http: //123.456.789/index.html , но был замаскирован для запуска в http://somewebSite.com/index.html . Когда я ввел http: //123.456.789/index.html в браузере, щелкнув по тем же ссылкам, в результате не возникло проблем с X-фреймами в консоли JS, но запущено http: //somewebSite.com/index.html. Чтобы правильно маскировать, вы должны добавить DNS-серверы своего хоста в свою службу домена, то есть у godaddy.com должны быть серверы имен, например ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, если вы были используя digitalocean.com в качестве вашего хостинга.

-1
задан Mobin F.R.G 13 July 2018 в 10:26
поделиться

2 ответа

Вы дважды читаете файл (с file и file_get_contents), который, я думаю, путает более поздний код. У вас есть все, что вам нужно, с первым вызовом - массив всех строк в файле. Вы также используете str_replace для удаления содержимого, что кажется немного опасным, если какое-либо содержимое повторяется.

Я бы реорганизовал это, чтобы просто отфильтровать массив строк на основе их строк, номер, затем записать его обратно в файл за одну операцию:

$myfile = 'txt.txt';
$remove = [1, 3, 5, 7, 10];

// Read file into memory
$lines = file($myfile);

// Filter lines based on line number (+1 because the array is zero-indexed)
$lines = array_filter($lines, function($lineNumber) use ($remove) {
    return !in_array($lineNumber + 1, $remove);
}, ARRAY_FILTER_USE_KEY);

// Re-assemble the output (the lines already have a line-break at the end)
$output = implode('', $lines);

// Write back to file
file_put_contents($myfile, $output);
3
ответ дан iainn 17 August 2018 в 13:08
поделиться

Если файл помещается в память, вы можете сделать следующее:

$myfile='txt.txt';
$remove=array(1,3,6,7,10);
file_put_contents($myfile, implode(PHP_EOL,array_diff($file($myfile,FILE_IGNORE_NEW_LINES), $remove))); 

Примечание: поскольку это немного неоднозначно, есть ли $remove содержимое или строки, которые вы хотите удалить, код удаляет содержимое. Если вы хотите удалить строки, измените array_diff($file($myfile,FILE_IGNORE_NEW_LINES), $remove) на array_diff_keys($file($myfile,FILE_IGNORE_NEW_LINES), array_flip($remove))

Если ваш файл большой, вам нужно прибегнуть к какой-то потоковой передаче. Я предлагаю не читать и писать в один файл и делать что-то вроде:

$myfile='txt.txt';    
$remove=array(1,3,6,7,10);
$h = fopen($myfile,"r");
$tmp = fopen($myfile.".tmp", "w");
while (($line = fgets($h)) !== false) {
      if (!in_array(rtrim($line, PHP_EOL), $remove)) {
          fwrite($tmp, $line);
      }
}
fclose($h);
fclose($tmp);
unlink($myfile);
rename($myfile.".tmp", $myfile);
1
ответ дан apokryfos 17 August 2018 в 13:08
поделиться
  • 1
    Спасибо, но ваш второй код имеет некоторые проблемы. Временной файл нельзя переименовать, потому что он использовался другим процессом, и он также имеет проблемы в ((fgets)), который говорит, что fgets () ожидает, что параметр 1 будет ресурсом, null данный. – Mobin F.R.G 13 July 2018 в 10:52
  • 2
    @ Cr3diT0r у него было несколько ошибок, теперь нужно работать – apokryfos 13 July 2018 в 10:53
  • 3
    Спасибо, он работает отлично! И вы, и коды iainn работают нормально! p.s: Я не могу голосовать за вас из-за ограничений репутации sry & lt; 3 – Mobin F.R.G 13 July 2018 в 10:57
Другие вопросы по тегам:

Похожие вопросы: