Токенизируйте файлы .htaccess - PullRequest
4 голосов
/ 18 августа 2011

Спорим, ты не ожидал этого? ;)

Итак, мой проект требует, чтобы я специально прочитал и разбирался в .htaccess файлах .

К сожалению, поиск в Google приводит только к бесконечным горестям людей, пытающихся заставить своих .htaccess работать (извините, не смог устоять перед комментарием).

Во всяком случае, я немного боюсь пытаться вытащить эту вещь из проектов с открытым исходным кодом, которые ее используют. Видите ли, за последние несколько недель я потратил много времени, пытаясь исправить свои проблемы с этой стратегией, только чтобы узнать, что мне лучше читать RFC и спецификации и строить все по-своему .

Итак, если вы знаете о библиотеке или каком-либо (надеюсь чистом!) Коде, который делает это, пожалуйста, поделитесь. В то же время, если вы знаете о каких-либо статьях о формате файлов .htaccess, я уверен, что они будут очень полезны. Спасибо.

NB: Я довольно многоязычен и могу использовать любую кодовую базу, даже если конечный код будет Delphi. Я знаю, что спрашиваю слишком много, но я бы хотел видеть меньше C ++. Просто подумайте о моем психическом здоровье, прежде чем делиться кодом C ++. :)

Редактировать: Ну, я думаю, что сам собираюсь сделать это вручную. Файловая структура выглядит так:

directive arg1 arg2 argN
<begin directive section>
</end directive section>
# single line comment

1 Ответ

4 голосов
/ 18 августа 2011

.htaccess грамматика на самом деле точно такая же, как сама конфигурация Apache, и примеры парсеров для нее существуют.

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

Английский метод разбора:

For each line in the file:
  Strip whitespace from beginning and end of line.
  If the line starts with a '#':
    Parse it as a comment (or skip it)

  Else, If the line starts with a '<':
    If the next character is a '/', the line is a closing tag:
      Seek to the next '>' to get the tag name, and pop it from the tag stack.
    Else, the line is an opening tag:
      Seek to the next '>' for the tag name.
      If the tag, trimmed, contains whitespace:
        Split on the first whitespace. The right side is params, left is the tag. 
        (IfModule, Location, etc use this)

      Push the tag name to the tag stack.

  Else, the line is a directive:
    Split the line on whitespace. This is the directive and params.

Просто добавьте обработку котировок, и все готово.

...