我正在尝试在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
。
我希望有人可以帮助我。
答案 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);
}