|
#!/usr/bin/php |
|
<?php |
|
|
|
/** |
|
* Рекурсивный обход каталогов, проверяем файлы с заданным расширением на предмет неверно используемых "short_open_tag", |
|
* т.е. коротких php-тегов там, где их быть не должно. |
|
* |
|
* вызов: |
|
* |
|
* script.php /path/to/files [extension] [replace] |
|
* |
|
* Чтобы не просто проверить файлы, но сразу заменить в них неверные теги, третьим параметром должно быть слово |
|
* "replace". Именно слово, это преохранитель от случайных опечтаток и т.п. |
|
*/ |
|
|
|
if ($argc < 2) { |
|
throw new InvalidArgumentException('Неверный вызов. Нужен, как минимум, путь к проверяемым файлам'); |
|
} |
|
|
|
$params = [ |
|
'path' => $argv[1], |
|
'extension' => $argv[2] ?? 'htm', |
|
'replace' => isset($argv[3]) && $argv[3] == 'replace', |
|
]; |
|
|
|
analyze(...array_values($params)); |
|
|
|
/** |
|
* Сбор данных по неверно заданным коротким php-тегам |
|
* @param string $path абсолютный путь к файлам |
|
* @param string $extension расширение файлов для анализа |
|
* @param bool $replace TRUE - заменять неверные php-теги |
|
*/ |
|
function analyze(string $path, string $extension, bool $replace) |
|
{ |
|
/** |
|
* Вспомогательная функция для вывода инфы о проверяемых файлах |
|
* @param string $path полный путь каталога, в котором анализируются файлы |
|
* @param string $fullName полный путь + имя проверяемого сейчас файла |
|
*/ |
|
$printFileName = function (string &$path, string $fullName) { |
|
if ($path) { |
|
echo PHP_EOL . $path . PHP_EOL; |
|
$path = null; |
|
} |
|
|
|
echo PHP_EOL . basename($fullName) . PHP_EOL; |
|
}; |
|
|
|
$dirList = new \DirectoryIterator($path); |
|
foreach ($dirList as $obj) { |
|
if ($obj->isDot()) { |
|
continue; |
|
} |
|
$name = $obj->getPathname(); |
|
if ($obj->isDir()) { |
|
analyze($name, $extension, $replace); |
|
continue; |
|
} else if (!preg_match("/$extension$/i", $name)) { |
|
continue; |
|
} |
|
|
|
$file = file_get_contents($name); |
|
|
|
// Шаблон: открывающая php-скобка, за которой нет "php" или знака "=" возможно с пробелом |
|
$pattern = '/<\?(?!php|\s?=)/i'; |
|
|
|
if ($replace) { |
|
$count = 0; |
|
$file = preg_replace($pattern, '<?php', $file, -1, $count); |
|
file_put_contents($name, $file); |
|
if ($count) { |
|
$printFileName($path, $name); |
|
echo 'Заменено тегов: ' . $count . PHP_EOL; |
|
} |
|
} else { |
|
if (preg_match_all($pattern, $file, $matches, PREG_OFFSET_CAPTURE)) { |
|
$printFileName($path, $name); |
|
echo '----' . PHP_EOL; |
|
foreach ($matches[0] as $m) { |
|
echo substr($file, $m[1], 15) . PHP_EOL |
|
. '...' . PHP_EOL; |
|
} |
|
} |
|
} |
|
} |
|
} |
Статья, поясняющая назначение скрипта.