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";
    }
}
Другие вопросы по тегам