如何让preg_replace()删除两个标签之间的文本?

时间:2014-11-07 19:07:05

标签: php tags preg-replace

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

我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:2)

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

所以有以下

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

这会将// RealtimeTesterStart的内容删除到// RealtimeTesterEnd和标签本身。

答案 1 :(得分: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);
}