Я пытаюсь преобразовать большой веб-сайт в PHP. Все файлы имеют почти одинаковые разделы заголовка/заголовка и нижнего колонтитула.
Я пытаюсь объединить все эти разделы заголовка и нижнего колонтитула, поместив их в отдельный файл.
Так что мне нужно заменить все мои
<?php include_once "include/header.php" ?>
А также
<?php include_once "include/footer.php" ?>
из всех файлов в каталоге..
Это приблизительный рисунок того, что мне нужно сделать. Пожалуйста, посмотрите код ниже..
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE=edge">
<meta name = "viewport" content = "">
<meta name = "description" content = "">
<meta name = "author" content = "">
<title></title>
<link rel = "apple-touch-icon" href = "">
<link rel = "shortcut icon" href = "">
<!-- Stylesheets -->
<link rel = "stylesheet" href = ""> <!-- Some Stylesheets -->
<link rel = "stylesheet" href = ""> <!-- Some Stylesheets -->
<link rel = "stylesheet" href = ""> <!-- Some Stylesheets -->
<!-- Scripts -->
<script src = ""></script>
</head>
<body class = "">
<nav class = "nav1" role = "navigation">
<!-- Some HTML -->
</nav>
<div class = "menubar1">
<!-- Some HTML -->
</div>
<div class = "menubar2">
<!-- Some HTML -->
</div>
<!-- ========================================================= -->
<!-- ========================================================= -->
<!-- PAGE CONTENTS -->
<!-- ========================================================= -->
<!-- ========================================================= -->
<!-- Footer -->
<footer class = "site-footer">
<!-- Some HTML -->
</footer>
<script src = ""></script> <!-- Some Script Tags -->
<script src = ""></script> <!-- Some Script Tags -->
<script src = ""></script> <!-- Some Script Tags -->
<script src = ""></script> <!-- Some Script Tags -->
<!-- Page -->
<!-- Google Analytics -->
<script>
/* Some Scripts */
</script>
</body>
</html>
В приведенном выше коде мне нужно заменить все сверху до
<div class = "menubar2">
(Пока не закрывается тег) с участием
<?php include_once "include/header.php" ?>
Кроме того, мне нужно заменить все ниже нижнего колонтитула
с участием
<?php include_once "include/footer.php" ?>
Пожалуйста, помогите мне заменить эту часть файла моей строкой.
Заранее спасибо?..
Нет, верхний и нижний колонтитулы не одинаковы во всех файлах. Это была одна из проблем, которые меня беспокоили.
И да.. Мне нужно сделать это с помощью PHP.. Мне нужно перечислить и выбрать все имена файлов в папке и извлечь их содержимое в переменную. Но я никогда не мог понять, как заменить строки ..
Являются ли эти <!-- ========================================================= --> частью фактического HTML-кода ваших страниц или нет? То же самое для <!-- PAGE CONTENTS -->.
Привет. Эти комментарии предназначены только для представления. Фактический код намного больше, чем этот. Я добавил их в вопрос, чтобы другим было легче читать.
Конечно, я спросил, потому что это сделало бы шаблон поиска более надежным. В любом случае, я ответил ниже.






Это быстрое грубое исправление ... не проверял, но надеюсь, что оно сработает!
Срочно! Если вы планируете добавить <div> внутрь <div class = "menubar2"></div>, добавьте этот <div class = "match-hidden"></div> после </div> закрывающего тега class .menubar2.
Измените первым preg_match с preg_match('/<!DOCTYPE html>(.*?)<div class = "match-hidden">(.*?)</div>/s',$file,$newfile);
$file = file_get_contents('replace_head.html');
preg_match('/<!DOCTYPE html>(.*?)<div class = "menubar2">(.*?)</div>/s',$file,$newfile);
preg_match('/<footer class = "site-footer">(.*?)</html>(.*?)/s',$file,$newfile2);
if ($newfile == TRUE){
$file1 = str_replace([$newfile[0]],['<?php include_once "include/header.php" ?>'],$file);
if ($newfile2 == TRUE){
$file2 = str_replace([$newfile2[0]],['<?php include_once "include/footer.php" ?>'],$file1);
//header('content-type:plain/text');
//Un-comment this if you want to download current file
header('content-type:application/json');
//Comment this if you want to see it as html
echo($file2);
}
}
Эй, спасибо.. Это почти сделало это.. Хотя нижний колонтитул работает отлично, заголовок оставляет незамеченными последние 2 закрывающих тега div.. Вот как устроен мой «menubar2».. <div class = "menubar2"> <div> < div> <ul> <li></li> <li></li> </ul> </div> </div> </div> Вот как я получаю вывод после запуска кода, который вы мне дали. . <?php include_once "include/header.php" ?> </div> </div>
Кажется, я не могу отформатировать код в разделе комментариев, как в вопросе. Надеюсь, вы это поймете.
Кстати, я попытался воссоздать проблему с разделом нижнего колонтитула (поместив все содержимое раздела нижнего колонтитула в 2 div.. например, <footer><div><div> --- </div></div></footer >). Но вроде нормально работает..
Просто добавьте <div class = "match-hidden"><div> после <div class = "menubar2"> <div> <div> <ul> <li></li> <li></li> </ul> </div> </div> </div> для завершения preg_match и используйте это preg_match('/<!DOCTYPE html>(.*?)<div class = "match-hidden">(.*?)</div>/s',$file,$newfile);
Привет, я сожалею о том, что неоднократно задавал вопросы. Но редактировать файлы проекта нецелесообразно, так как всего их сотни. Если бы я добавил <div class = "match-hidden"><div> во все эти файлы, это заняло бы целый день работы. Я бы предпочел вручную включить теги php верхнего и нижнего колонтитула к тому времени, когда я добавлю предложенный вами div. Есть ли другой способ сделать это?
Я немного поиграл с preg_match, который вы мне дали, и, похоже, он работает, когда я меняю его на preg_match('/<!DOCTYPE html>(.*?)<div class = "menubar2">(.*?)<\ /div>(.*?)</div>(.*?)</div>/s',$file,$newfile);
Это выбор закрытия </div> после закрытия <div class = "menubar2"></div>
Хотя я заработал с этим кодом, есть ли другой способ, который не включает подсчет количества </div> внутри <div class = "menubar2"> ?
Во-первых, обратите внимание, что регулярные выражения вообще никогда не должны использоваться с DOM. Однако, поскольку мы говорим о массовой замене внутри файлов, я полагаю, что это приемлемо в данном случае (вы не хотите терять форматирование, а массовое удаление узлов с DOM также было бы неудобным).
Теперь, принимая во внимание то, что вы сказали в другом комментарии о структуре вашего menubar2 div, это должно сработать.
Редактировать: теперь с динамическим количеством div под menubar2:
// Compute the amount of divs within `menubar2` div
libxml_use_internal_errors(true);
$doc = new \DOMDocument();
$doc->loadHTML($html);
$menubar2_inner_div_count = (new \DOMXPath($doc))
->query('//div[@class = "menubar2"]//div')
->length;
// Header
$html = preg_replace(
'/^.*?<div class = "menubar2">' . str_repeat('.*?</div>', $menubar2_inner_div_count + 1) . '/s',
'<!-- Header -->' . PHP_EOL . '<?php include_once "include/header.php" ?>',
$html
);
// Footer
$html = preg_replace(
'/<footer class = "site-footer">.*?</html>/s',
'<?php include_once "include/footer.php" ?>',
$html
);
// (Optional) Remove now useless indentation (supposes your indent is 8 spaces,
// otherwise replace accordingly)
$html = preg_replace('/^ {8}/m', '', $html);
Демо: https://3v4l.org/G3HbK
@Jayakrishnan Любой комментарий по этому поводу? Вы можете увидеть, как это работает, по демонстрационной ссылке выше.
Привет, я уже заработал, используя аналогичный код (пожалуйста, обратитесь к комментарию к другому вопросу). Сейчас мне нужно что-то, что не включает подсчет количества конечных тегов во всех файлах. Пожалуйста, помогите мне, если что-то вроде это возможно.
Привет.. Извините за слишком ленивый ответ.. Я был занят другими проектами, поэтому это было отложено.. Еще раз спасибо за ваш ответ :)
Являются ли эти части верхнего/нижнего колонтитула одинаковыми во всех файлах? В любом случае вы должны быть в состоянии добиться этого с помощью массовой замены регулярных выражений, используя IDE/редактор, который имеет такую возможность. Однако ваш вопрос не имеет прямого отношения к PHP, если только вы не хотите делать это с помощью PHP-скрипта, что также должно быть возможно.