БлогNot. Внедрение новой строки во все документы статического сайта

Внедрение новой строки во все документы статического сайта

Изменить что-то во всех html-файлах статического сайта с тысячами страниц (например, добавить сообщение о переезде) - гораздо более простое дело, чем кажется.

Во-первых, надо иметь локальную копию сайта на компьютере, да и "издеваться", пожалуй, не над ней, а над копией копии :)

Во-вторых, должен быть доступ по ftp и Ваше умение работать с ним, иначе задача теряет смысл.

При всей "разнокалиберности" страниц статического сайта у всех них должно быть что-то общее - например, наличие тега <body> ... </body>. Другое дело, что открывающая часть тега может содержать разные атрибуты на разных страницах, так что замену лучше всего делать с помощью регулярного выражения:

//$s - строка с содержимым файла, например, получена методом file_get_contents 
$s2=preg_replace ("/(<body[^>]*>)/msi","$1\nНОВЫЙ_ТЕКСТ\n",$s);

Здесь НОВЫЙ_ТЕКСТ (с символами перевода строки до и после него) добавляется после открывающей части тега body, то есть, в самом верху каждой страницы.

Вместо величины НОВЫЙ_ТЕКСТ обычно целесообразно поставить небольшой яваскрипт, который мог бы автоматически сформировать адрес новой страницы. Например, если скрипт с именем script.js "лежит" в корневой папке сайта pers.narod.ru, получится такой НОВЫЙ_ТЕКСТ:

<script type=\"text/javascript\" src=\"http://pers.narod.ru/script.js\"></script>

Символ "обратный слеш" перед всеми двойными кавычками необходим - так как код будет внедрён внутрь строки в двойных кавычках.

А что делать с теми долями процента пользователей, у которых выключен Яваскрипт? Думаю, не стоит пренебрегать и ими - дополним величину НОВЫЙ_ТЕКСТ тегом <noscript>, в котором напишем, например, ссылку на статическую страницу, где описан переезд:

<noscript><p>Этот сайт переехал. Подключите Javascript, чтобы увидеть новый адрес страницы 
или перейдите к <a href=\"http://nickolay.info/адрес_статьи.html\">статье</a></p></noscript>

Добавив это после </script> и слив всё в одну строку, получим искомую строчку для замены.

Внедрение нового текста непосредственно перед закрытием тега </body>, то есть, "в самом низу", было бы ещё проще - регулярное выражение заменится на

$s2=preg_replace ("/(<\/body>)/msi","\nНОВЫЙ_ТЕКСТ\n$1",$s);

Используя это и перебирая файлы по списку как в этой заметке (список составлен абсолютно так же), получим следующий код:

<?php
echo '<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Замена в файлах по списку с сохранением структуры папок</title>
</head><body>';

$path="C:/Temp/ukoz/"; //Общая часть путей, лучше с прямым слешем, а не обратным и слеш в конце
 
$lines = file('1.txt');
$ok=$bad=$all=0;
$error='';
foreach ($lines as $line) {
 $line=rtrim($line);
 $line=str_replace ('\\','/',$line); //Заменяем слеши на обратные
 $s=file_get_contents ($line);
 if ($s===false) {
  $error.=$line.'<br>';
  $bad++;
 }
 else {
  $s2=preg_replace ("/(<body[^>]*>)/msi","$1\nНОВЫЙ_ТЕКСТ\n",$s);
  $nextfile = explode("$path", $line);
  $filename= substr(strrchr ($nextfile[1],'/'),1); //Имя файла без слеша в начале
  if (empty($filename)) $filename=$nextfile[1];
  $filepath=array();
  if ($filename!=$nextfile[1]) $filepath= explode("$filename", $nextfile[1]);
  else $filepath[0]='./'; //Путь к файлу - или текущая папка, если в корневой папке поддерева
  if (!is_dir($filepath[0])) @mkdir($filepath[0]); //Если папка ещё не создана - создать
  $i=@file_put_contents (''.$filepath[0].$filename,$s2);
  if ($i<1) {
   $error.=$line.'<br>';
   $bad++;
  }
  else $ok++;  
 }
 $all++;
}
echo '<p>Всего обработано файлов из списка: '.$all; 
echo '<p>Успешно скопировано: '.$ok; 
echo '<p>Ошибок: '.$bad.'<br>'.$error; 
echo '</body></html>';
?>

Здесь предполагается, что строка внедряется в начало документа, сразу после <body>.

Наконец, рассмотрим содержимое самого файла script.js. Если нам просто нужно заменить домен во всех адресах, скажем, pers.narod.ru на nickolay.info, полный код скрипта будет выглядеть так:

var url = window.location.toString().replace('pers.narod.ru','nickolay.info');
document.writeln ('<p>Постоянный адрес этой страницы: <a href="'+url+'">'+url+'</a></p>');

Ну и можно любой другой текст добавить в document.writeln. Ошибкой было бы window.location.replace(...) - попытается сменить URL страницы :)

Массовую перекодировку файлов, которая тоже бывает нужна при переездах, проще всего сделать по рецепту с этой страницы блога.

Что касается прямого редиректа на новые страницы, выполняемого директивой

<meta http-equiv="refresh" content="0; url=новый_сайт">

помещаемой в тег <head> документа, обычно такое на бесплатных хостингах запрещено и банится как дорвеи.

После этого осталось взять изменённые файлы из папки PHP-скрипта и "залить" обратно на хостинг, сегодня обработал так пару сайтов, в том числе и свой на бывшем "Народе" - всё ради того, чтоб постепенно убрать их с "Юкоза"... Каждый сайт отнял не более получаса.

18.04.2013, 17:41 [11263 просмотра]


теги: javascript html список php

К этой статье пока нет комментариев, Ваш будет первым