如何获取preg_replace()来删除两个标记之间的文本


How to get preg_replace() to delete text between two tags?

我正在尝试在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;
    }
}
?>

如前所述,我想删除这些标签中的所有内容,以及标签本身:

//RealtimeTesterStart
//RealtimeTesterEnd

重要的是,标记包含正斜杠,并且如果一个文件包含多个这样的标记,则只删除//RealtimeTesterStart//RealtimeTesterEnd的代码,而不删除//RealtimeTesterEnd//RealtimeTesterStart的代码。

我希望有人能帮助我。

您还可以更改正则表达式以使用[''s''s]字符集,该字符集可用于匹配任何字符,包括换行符。

以下也是如此

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

这将删除//RealtimeTesterStart到//RealtimeTesterEnd的内容以及标记本身。

我假设//RealtimeTesterStart//RealtimeTesterEnd和中间的代码在不同的行上?在PCRE中,.与换行符不匹配。您需要使用s修饰符(并且您不需要(),除非您需要捕获的文本进行替换):

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

另外,对于glob而不是array_filter,请查看GLOB_ONLYDIR。此外,也可能是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);
}