Не могу заменить кусок кода с str_replace

195
06 ноября 2018, 04:10

Хотел удалить определенный кусок кода в php-файле, решил сделать это с str_replace(). Таким образом:

$filename = 'check.php';
        $a = 'public function actionTitle1()
{
    $this->title = "Title 1";
    $this->meta_author = "Arandar";
    $this->meta_copyright = "Copyright © 2018 Arandar. All Rights Reserved.";
    $content = $this->view->render("title1", array(), true);
    $this->render($content);
}';
        $b = '';
        $file1 = file_get_contents($filename);
        $file1 = str_replace($a, $b, $file1);
        file_put_contents($filename, $file1);

Вот так выглядит файл, где нужно удалить файл с соблюдением табуляции и переносов:

    public function actionTitle1()
{
    $this->title = "Title 1";
    $this->meta_author = "Arandar";
    $this->meta_copyright = "Copyright © 2018 Arandar. All Rights Reserved.";
    $content = $this->view->render("title1", array(), true);
    $this->render($content);
}

Но увы, не работает. Файл обновляется, однако остается без изменений. Подскажите, будьте добры, в чем ошибка, ибо уже все облазил, нашел какие-то варианты на JS, однако хотелось бы на PHP.

Answer 1

Для вашего текущего кода (контроллер actionTitle()) вполне подойдёт такой шаблон:

'~public function actionTitle1\(.*?\)[^{]+\{[^}]+\}~s'

Как видно из начала шаблона, под удаление попадает строка, начинающаяся со слов public function actionTitle1, и заканчивающаяся фигурной скобкой }. Но если в теле метода встретится ещё пара фигурных скобок, то этот вариант сработает не корректно. Именно поэтому я в комментариях говорил, что для регулярных выражений нужно учитывать все возможные варианты подстрок.

$str = '
    public function actionTitle1()
{
    $this->title = "Title 1";
    $this->meta_author = "Arandar";
    $this->meta_copyright = "Copyright © 2018 Arandar. All Rights Reserved.";
    $content = $this->view->render("title1", array(), true);
    $this->render($content);
}
    public function actionBody()
{
    $this->title = "Title 1";
    $this->meta_author = "Arandar";
    $this->meta_copyright = "Copyright © 2018 Arandar. All Rights Reserved.";
    $content = $this->view->render("title1", array(), true);
    $this->render($content);
}
';
echo preg_replace('~public function actionTitle1\(.*?\)[^{]+\{[^}]+\}~s', '', $str);

В результате вы получите строку:

    public function actionBody()
{
    $this->title = "Title 1";
    $this->meta_author = "Arandar";
    $this->meta_copyright = "Copyright © 2018 Arandar. All Rights Reserved.";
    $content = $this->view->render("title1", array(), true);
    $this->render($content);
}
READ ALSO
HTML DOM Parser таблицы

HTML DOM Parser таблицы

Прошу помочь, я никак не могу разобраться!

262
Опыт участия в PHP (и других) Opensource проектах

Опыт участия в PHP (и других) Opensource проектах

Уважаемое сообщество, хотел бы узнать у вас как именно вы принимаете (если принимаете) участия в OpenSource?

196
Помощь с выводом таблицы в реальном времени и проверки значений

Помощь с выводом таблицы в реальном времени и проверки значений

Очень нужна помощь и советы по реализацииИмеется административная панель с одной таблицей, с выводом последних 60 строк из MySQL базы

244