Я столкнулся с этой проблемой при запуске веб-сайта 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 в качестве вашего хостинга.
Вы дважды читаете файл (с 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);
Если файл помещается в память, вы можете сделать следующее:
$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);