Я пытаюсь создать функцию в 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
,
Я надеюсь, что кто-то может мне помочь.
Я предполагаю что //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);
}
Вы также можете изменить свое регулярное выражение, чтобы использовать набор символов [\ s \ S], который можно использовать для соответствия любому символу, включая разрывы строк.
Итак, имейте следующее
preg_replace('#\/\/RealtimeTesterStart[\s\S]+\/\/RealtimeTesterEnd#', '', $string);
Это приведет к удалению содержимого // RealtimeTesterStart to // RealtimeTesterEnd и самих тегов.