Я пытаюсь сделать функцию на 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
.
Я надеюсь, что кто-то может мне помочь.
Я предполагаю, что //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 в//RealtimeTesterEnd и сами теги.