Окончательный парсер PHP-url

Прежде чем вы скажете мне использовать parse_url , это не очень хорошо и слишком много ошибок. Здесь есть много вопросов по разбору URL-адресов синтаксического анализа, но почти все должны анализировать только некоторые определенные классы URL-адресов или, в противном случае, неполные.

Я ищу окончательный RFS-совместимый синтаксический анализатор URL в PHP, который будет надежно обрабатывать любой URL-адрес, с которым может столкнуться браузер. В этом я включаю:

  • Страница-внутренние ссылки # , #title
  • URL-адреса, blah/thing.php
  • URL-адреса сайтов /blah/thing.php
  • URL-адреса анонимного протокола //ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js
  • Callto URLs callto:+442079460123
  • Файл файлов file:///Users/me/thisfile.txt
  • Mailto URLs mailto:user@example.com?subject=hello , mailto:?subject=hello mailto:user@example.com?subject=hello mailto:?subject=hello

и поддерживать всю обычную схему / аутентификацию / домен / путь / запрос / фрагмент и т. д. и разбивать все эти элементы на массив, с дополнительными флагами для относительных / схемных URL-адресов. В идеале это будет с восстановителем URL (например, http_build_url), поддерживающим одни и те же элементы, и я также хотел бы, чтобы проверка была применена (т. Е. Она должна иметь возможность интерпретировать URL-адрес наилучшим образом, если это недействительно, но флаг как таковые, так же, как и браузеры).

Этот ответ содержал дразнящую ссылку на такого рода животных в стиле Ферма, но на самом деле он никуда не денется.

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

Итак, существует ли такая вещь?

Не знаете, сколько ошибок имеет parse_url() , но это может помочь:

Поскольку алгоритм «first-match-wins» идентичен «жадному» методу устранения неоднозначности, используемому регулярными выражениями POSIX, естественным и обычным явлением является использование регулярного выражения для синтаксического анализа потенциальных пяти компонентов ссылки URI.

Следующая строка является регулярным выражением для разложения хорошо сформированной ссылки URI на ее компоненты.

 ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9 

Источник: http://tools.ietf.org/html/rfc3986#page-51

Он разбивает место как:

 $2 - scheme $4 - host $5 - path $6 - query string $8 - fragment 

Чтобы перестроить, вы можете использовать:

 $1 . $3 . $5 . $6 . $8