Skip to content

Instantly share code, notes, and snippets.

@VijitCoder
Created October 3, 2017 11:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save VijitCoder/bc7ef11252a78b9c72af2f9158c31528 to your computer and use it in GitHub Desktop.
Save VijitCoder/bc7ef11252a78b9c72af2f9158c31528 to your computer and use it in GitHub Desktop.
Поиск и замена коротких php-тегов
#!/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;
}
}
}
}
}
@VijitCoder
Copy link
Author

Статья, поясняющая назначение скрипта.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment