PHP Regex исключает комментарии, находящие подавление ошибок
Я пытаюсь сделать регулярное выражение, чтобы просмотреть ранее существовавшую базу кода, которая, кажется, злоупотребляет чертовски символом подавления ошибок php (@
) как для ссылок на переменные, так и для вызовов функций. В результате я хочу выполнить поиск по всей базе кода, чтобы создать список всех использований. Проблема в том, что большая часть кода также содержит perldoc, и я не уверен, как исключить очевидные комментарии.
большая часть perldoc, кажется, основана на минимуме пробела-звездочки-пробела. например:
/**
* @param int $somvar
*/
так что это может быть сопоставлено с чем-то вроде /^\s*\*\s+/
достаточно последовательно.
Регулярное выражение, которое я использую, чтобы найти использование символа подавления ошибок (но оно также захватывает perldoc):
/(@[\$\w][\w\d]*)/
Его результаты удовлетворительные, за исключением того, что вы собрали весь перддок.
Я пытался взглянуть на некоторые примеры негативного прогнозирования, но, похоже, не уклоняюсь от этих perldoc комментариев чем-то, что я еще пробовал. Один пример того, что не работает, выглядит следующим образом:
(?!\s*[\*\/])(@[\$\w][\w\d]*)
Любая помощь приветствуется
1 ответ
Вы можете использовать PHP token_get_all()
найти все символы @ вместо регулярных выражений. Таким образом, вы позволяете собственному внутреннему анализатору PHP анализировать файл для вас:
$source_file = 'source_file_to_open.php';
$source = file_get_contents($source_file);
$tokens = token_get_all($source);
// Loop through all the tokens
for ($i=0; $i < count($tokens); $i++) {
// If the token is equal to @, then get the line number (3rd value in array)
// of the *following* token because the @ does not have a line number because
// it's not listed as an array, just a string.
if ($tokens[$i] == '@') {
echo "@ found in $source_file on line: {$tokens[$i+1][2]}<br />\n";
}
}