Прежде чем вы скажете мне использовать parse_url
, это не очень хорошо и слишком много ошибок. Здесь есть много вопросов по разбору URL-адресов синтаксического анализа, но почти все должны анализировать только некоторые определенные классы URL-адресов или, в противном случае, неполные.
Я ищу окончательный RFS-совместимый синтаксический анализатор URL в PHP, который будет надежно обрабатывать любой URL-адрес, с которым может столкнуться браузер. В этом я включаю:
#
, #title
blah/thing.php
/blah/thing.php
//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js
callto:+442079460123
file:///Users/me/thisfile.txt
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