38471-vm/check_nesting.php
2026-02-18 10:32:06 +00:00

49 lines
1.8 KiB
PHP

<?php
$content = file_get_contents('index.php');
$lines = explode("\n", $content);
$stack = [];
$in_php = false;
foreach ($lines as $idx => $line) {
$line_num = $idx + 1;
// Simple check for PHP tags
if (strpos($line, '<?php') !== false) $in_php = true;
if (strpos($line, '?>') !== false) $in_php = false;
// Alternative syntax checks
if (preg_match('/\bif\b\s*\(.*\)\s*:/', $line)) {
$stack[] = ['type' => 'if', 'line' => $line_num];
} elseif (preg_match('/\belseif\b\s*\(.*\)\s*:/', $line)) {
// elseif is part of the current if block, so it doesn't change nesting level
} elseif (preg_match('/\belse\b\s*:/', $line)) {
// else is part of the current if block, so it doesn't change nesting level
} elseif (preg_match('/foreach\s*\(.*\)\s*:/', $line)) {
$stack[] = ['type' => 'foreach', 'line' => $line_num];
}
if (strpos($line, 'endif;') !== false) {
if (empty($stack)) {
echo "Unexpected endif; at line $line_num\n";
} else {
$last = array_pop($stack);
if ($last['type'] !== 'if') {
echo "Mismatched endif; at line $line_num (expected endforeach; for {$last['type']} at line {$last['line']})\n";
}
}
}
if (strpos($line, 'endforeach;') !== false) {
if (empty($stack)) {
echo "Unexpected endforeach; at line $line_num\n";
} else {
$last = array_pop($stack);
if ($last['type'] !== 'foreach') {
echo "Mismatched endforeach; at line $line_num (expected endif; for {$last['type']} at line {$last['line']})\n";
}
}
}
}
foreach ($stack as $unclosed) {
echo "Unclosed {$unclosed['type']} starting at line {$unclosed['line']}\n";
}