Быстрый разбор PHP в C # - PullRequest
       13

Быстрый разбор PHP в C #

7 голосов
/ 16 сентября 2009

У меня есть требование для разбора PHP-файлов в C #. По сути, нам нужно, чтобы некоторые разработчики в другой стране загружали файлы PHP, и после загрузки нам нужно проверить файлы php и получить список всех методов, классов / функций и т. Д.

Я думал об использовании регулярных выражений, но я не могу тренироваться, если функция принадлежит классу и т. Д., Поэтому мне было интересно, есть ли уже что-то «там», которое будет анализировать файлы PHP и выплевывать его функции (я я стараюсь не писать полную реализацию AST).

У кого-нибудь есть идеи? Я посмотрел на Coco / R, но не смог найти файл грамматики PHP. Я использую .NET 2.0 и C #.

Ответы [ 2 ]

18 голосов
/ 16 сентября 2009

Почему это в C #? В PHP это сделать тривиально. Используйте функцию token_get_all(), и она разбивает PHP-файл на поток лексем, которые можно использовать для окончательного определения списка классов и методов путем написания конечного автомата.

Что бы вы ни делали, не пытайтесь делать это с помощью регулярных выражений. Это будет невероятно утомительно и подвержено ошибкам.

Редактировать: Для этого есть три основных варианта:

  1. Сделайте это на PHP. Это будет самый быстрый (в разработке) и самый простой вариант;
  2. Запустите PHP-скрипт командной строки, чтобы сделать это или сгенерировать серию токенов, которые могут быть интерпретированы программой C #. Это следующий самый простой;
  3. Используйте Phalanger , порт PHP для .Net framework. Это может быть более приемлемым для управления, поскольку это все еще код .Net; или
  4. Используйте Quercus , порт PHP для Java VM.

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

Чтобы беспокоиться о предполагаемых «недостатках безопасности» PHP, есть несколько проблем:

  1. Любой фреймворк или стек технологий могут иметь недостатки в безопасности. Тот факт, что ваш системный администратор позволяет только .Net эффективно протестовать против Java, просто указывает на иррациональный уклон. Я говорю это как давний разработчик Java: Java, .Net и PHP могут иметь недостатки безопасности;
  2. Вы можете запустить PHP из командной строки, чтобы он не обслуживал HTTP-запросы, что сводит проблему недостатков безопасности к нулю;
  3. Если вы беспокоитесь о внутренних угрозах безопасности (от кого-то, имеющего доступ к коробке), просто ограничьте исполняемый файл PHP CLI только для группы, в которую входит только ваша программа.
1 голос
/ 16 сентября 2009

Вы можете использовать ctags для своих целей. Я не уверен, как бы вы интегрировали его с C #, поскольку ctags написан на C.

В качестве альтернативы, если вы знаете свои парсеры, вы можете взглянуть на файлы грамматики в исходном тексте PHP. В частности zend_ini_parser.y и zend_language_parser.y.

Наконец, хотя это и не лучшее решение, вы могли бы , вероятно, избежать неприятностей с домашним набором регулярных выражений. Грамматика PHP довольно строгая в отношении классов и функций. Вам просто нужно отслеживать немного состояния, чтобы вы знали, к какому классу принадлежит функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...