Как получить preg_replace () для удаления текста между двумя тегами?

0

Я пытаюсь сделать функцию на PHP, которая может удалять код в двух тегах из всего.js файла в одной папке и во всех ее подпапках. Пока все работает, кроме preg_replace(). Это мой код:

<?php

deleteRealtimeTester('test');

function deleteRealtimeTester($folder_path)
{
    foreach (glob($folder_path . '/*.js') as $file) 
    {
        $string = file_get_contents($file); 

        $string = preg_replace('#//RealtimeTesterStart(.*?)//RealtimeTesterEnd#', 'test2', $string);

        $file_open = fopen($file, 'wb');
        fwrite($file_open, $string);
        fclose($file_open);
    }

    $subfolders = array_filter(glob($folder_path . '/*'), 'is_dir');

    if (sizeof($subfolders) > 0)
    {
        for ($i = 0; $i < sizeof($subfolders); $i++)
        {
            echo $subfolders[$i];
            deleteRealtimeTester($subfolders[$i]);
        }
    }
    else
    {
        return;
    }
}

?>

Как уже упоминалось, я хочу удалить все эти теги и теги themselve:

//RealtimeTesterStart

//RealtimeTesterEnd

Важно, чтобы теги содержали прямую косую черту, а также, если файл содержит несколько этих тегов, удаляется только код из //RealtimeTesterStart в //RealtimeTesterEnd а не из //RealtimeTesterEnd в //RealtimeTesterStart.

Я надеюсь, что кто-то может мне помочь.

Теги:
tags
preg-replace

2 ответа

1
Лучший ответ

Я предполагаю, что //RealtimeTesterStart, //RealtimeTesterEnd и код между ними находятся на разных строках? В PCRE . НЕ соответствует символам новой строки. Вам нужно использовать s модификатор (и вам не нужен () если вам не нужен захваченный текст для замены):

#//RealtimeTesterStart.*?//RealtimeTesterEnd#s

Кроме того, посмотрите на GLOB_ONLYDIR для glob вместо array_filter. Кроме того, возможно, file_put_contents вместо fopen и т.д.

Может быть, что-то вроде:

foreach (glob($folder_path . '/*.js') as $file) {
    $string = file_get_contents($file);
    $string = preg_replace('#//RealtimeTesterStart.*?//RealtimeTesterEnd#s', 'test2', $string);
    file_put_contents($file, $string);
}

foreach(glob($folder_path . '/*', GLOB_ONLYDIR) as $subfolder) {
    deleteRealtimeTester($subfolder);
}
2

Вы также можете изменить свое регулярное выражение, чтобы использовать набор символов [\ s\S], который можно использовать для соответствия любому символу, включая разрывы строк.

Итак,

preg_replace('#\/\/RealtimeTesterStart[\s\S]+\/\/RealtimeTesterEnd#', '', $string);

Это позволит удалить содержимое //RealtimeTesterStart в//RealtimeTesterEnd и сами теги.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню