См. Наш SD Search Engine . Это чувствительная к языку поисковая система, предназначенная для поиска больших баз кода со специальными языковыми классификаторами для C, C ++, Java, C #, COBOL, JavaScript, Ada, Python, Ruby и многих других языков, включая ваш целевой язык PHP ( PHP4 и PHP5).
Я думаю, что он делает все, что вы просили.
Индексирует языковые элементы, поэтому поиск по большим базам кода выполняется очень быстро (Linux Kernal ~ ~ 7,5 млн строк -> 2,5 секунды). (Шаг индексации выполняется
в Windows, но механизм отображения в Java.)
Хиты поиска отображаются в однострочном контекстном окне, в котором отображается номер файла и строки, а также строка с выделенным попаданием. При щелчках по попаданию открывается исходный код, вкладки расширяются соответствующим образом, и количество строк отображается правильно даже для языков, в которых есть правила подсчета нечетных строк (например, символы формы GCC WRT), с выделенной строкой совпадений и текстом попаданий. Нажатие в окне исходного кода запустит ваш любимый редактор файла.
Поскольку он понимает языковые элементы, он игнорирует пробелы, зависящие от языка. Он пропускает комментарии, если вы не настаиваете на их проверке. Таким образом, при поиске игнорируются пробелы, комментарии и границы строк (если язык считает, что границы строк - это пробелы, поэтому существуют сканеры, специфичные для языков). Язык запросов позволяет вам указать, какие языковые токены вы хотите (конкретные токены в кавычках или общие токены, такие как идентификаторы I, числа N, строки S, операторы O и пунктуация P) с ограничениями на значение токена, а также серию лексемы.
Ваш пример поиска:
myTestFunction($parameter,$another_parameter,$yet_another_parameter){doThis();
будет выражаться поисковой системе точно как:
I=myTestFunction '(' I ',' I ',' I ')' '{' I=dothis '(' ')' ';'
но, вероятно, было бы легче (меньше печатать) найти его как:
I=myTest* ... I=dothis
где I = myTest * означает идентификатор, начинающийся с myTest , а ... означает "рядом".
Поисковая система также предлагает регулярные выражения поиска по тексту, если вы настаиваете.
Таким образом, у вас все еще есть grep-подобные поиски (намного медленнее, чем индексированные поиски)
но с окном попадания и окнами отображения источника тоже.