2014-12-29 2 views
2

Я пытаюсь сделать регулярное выражение, чтобы просмотреть уже существующую базу кода, которая, кажется, злоупотребляет чертой из символа подавления ошибки PHP (@) как для ссылок переменных, так и для вызовов функций , В результате я хочу найти всю базу кода, чтобы создать список всех способов использования. Проблема в том, что большая часть кода также включает perldoc, и я не уверен, как исключить очевидные комментарии.PHP Regex исключить комментарии, обнаруживая ошибку подавления

Большая часть perldoc, по-видимому, основана на минимуме пробелов-пробелов-астерикс. например .:

/** 
    * @param int $somvar 
    */ 

поэтому он может быть согласован с чем-то вроде /^\s*\*\s+/ достаточно последовательно.

Регулярное выражение, я использую, чтобы найти обычаи подавления ошибки символа (но хватает perldoc также) является:

/(@[\$\w][\w\d]*)/ 

Результаты Это удовлетворительны сохранить для сбора всех perldoc.

Я попытался взглянуть на некоторые из примеров негативного внешнего вида, но, похоже, не избегаю этих комментариев perldoc тем, что я еще не пробовал. Одним из примеров тот, который не работает следующим образом:

(?!\s*[\*\/])(@[\$\w][\w\d]*) 

любая помощь

+0

, к сожалению, некоторые из них на самом деле используется вещами - например, доктрина или другие интерфейсы, которые ставят свои конфиги в блоках комментариев с @ символами – Scott

+0

не будет? Scott

+0

Кстати, я пробовал как негативные взгляды, так и отрицательные lookbehinds, но они не пропустили цитаты, или они закончили слишком много пропускать. Часть проблемы заключается в том, что мне особенно нужно искать пробелы-звездочки-пробелы в начале строки. Комментарии после символа не имеют значения, и я не хочу пропускать строки с операндами умножения. – Scott

ответ

1

Вы можете использовать РНР token_get_all() найти все @ символов вместо регулярных выражений. Таким образом, вы позволяете собственный внутренний анализатор РНР разобрать для вас файл:

$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"; 
    } 
} 
Смежные вопросы