Мне нужно автоматически заменить часть моего кода среди всех файлов в каталоге

Я пытаюсь преобразовать большой веб-сайт в PHP. Все файлы имеют почти одинаковые разделы заголовка/заголовка и нижнего колонтитула.

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

Так что мне нужно заменить все мои

  1. раздел заголовка (который занимает от 1045 до 1535 строк) с
<?php include_once "include/header.php" ?>

А также

  1. нижний колонтитул (который занимает от 80 до 140 строк) с
<?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" ?>

Пожалуйста, помогите мне заменить эту часть файла моей строкой.

Заранее спасибо?..

Являются ли эти части верхнего/нижнего колонтитула одинаковыми во всех файлах? В любом случае вы должны быть в состоянии добиться этого с помощью массовой замены регулярных выражений, используя IDE/редактор, который имеет такую ​​возможность. Однако ваш вопрос не имеет прямого отношения к PHP, если только вы не хотите делать это с помощью PHP-скрипта, что также должно быть возможно.

Jeto 12.05.2019 09:31

Нет, верхний и нижний колонтитулы не одинаковы во всех файлах. Это была одна из проблем, которые меня беспокоили.

Jayakrishnan 13.05.2019 04:09

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

Jayakrishnan 13.05.2019 04:17

Являются ли эти <!-- ========================================================= --> частью фактического HTML-кода ваших страниц или нет? То же самое для <!-- PAGE CONTENTS -->.

Jeto 13.05.2019 09:14

Привет. Эти комментарии предназначены только для представления. Фактический код намного больше, чем этот. Я добавил их в вопрос, чтобы другим было легче читать.

Jayakrishnan 13.05.2019 12:47

Конечно, я спросил, потому что это сделало бы шаблон поиска более надежным. В любом случае, я ответил ниже.

Jeto 13.05.2019 12:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
92
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это быстрое грубое исправление ... не проверял, но надеюсь, что оно сработает!
Срочно! Если вы планируете добавить <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>

Jayakrishnan 13.05.2019 05:08

Кажется, я не могу отформатировать код в разделе комментариев, как в вопросе. Надеюсь, вы это поймете.

Jayakrishnan 13.05.2019 05:13

Кстати, я попытался воссоздать проблему с разделом нижнего колонтитула (поместив все содержимое раздела нижнего колонтитула в 2 div.. например, <footer><div><div> --- </div></div></footer >). Но вроде нормально работает..

Jayakrishnan 13.05.2019 05:16

Просто добавьте <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);

C0deB0untyHunter 13.05.2019 14:53

Привет, я сожалею о том, что неоднократно задавал вопросы. Но редактировать файлы проекта нецелесообразно, так как всего их сотни. Если бы я добавил <div class = "match-hidden"><div> во все эти файлы, это заняло бы целый день работы. Я бы предпочел вручную включить теги php верхнего и нижнего колонтитула к тому времени, когда я добавлю предложенный вами div. Есть ли другой способ сделать это?

Jayakrishnan 14.05.2019 03:49

Я немного поиграл с preg_match, который вы мне дали, и, похоже, он работает, когда я меняю его на preg_match('/<!DOCTYPE html>(.*?)<div class = "menubar2">(.*?)<\ /div>(.*?)</div>(.*?)</div>/s',$fi‌​le,$newfile);

Jayakrishnan 14.05.2019 03:57

Это выбор закрытия </div> после закрытия <div class = "menubar2"></div>

C0deB0untyHunter 14.05.2019 19:31

Хотя я заработал с этим кодом, есть ли другой способ, который не включает подсчет количества </div> внутри <div class = "menubar2"> ?

Jayakrishnan 26.05.2019 15:33
Ответ принят как подходящий

Во-первых, обратите внимание, что регулярные выражения вообще никогда не должны использоваться с 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 Любой комментарий по этому поводу? Вы можете увидеть, как это работает, по демонстрационной ссылке выше.

Jeto 15.05.2019 09:07

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

Jayakrishnan 30.05.2019 10:51

Привет.. Извините за слишком ленивый ответ.. Я был занят другими проектами, поэтому это было отложено.. Еще раз спасибо за ваш ответ :)

Jayakrishnan 25.08.2019 15:58

Другие вопросы по теме