Как закодировать атрибут href в HTML

Что должно быть сделано против содержимого атрибута href: кодировка HTML или URL?

<a href="???">link text</a>

С одной стороны, поскольку атрибут href содержит URL, я должен использовать кодировку URL. С другой стороны, я вставляю этот URL в HTML, поэтому он должен быть закодирован в HTML.

Пожалуйста, помогите мне преодолеть это противоречие.

Спасибо.


EDIT:

Здесь противоречие. Предположим, что может быть < и ' > ' в URL. Кодировка URL-адресов не удалит их, поэтому в атрибуте href будут зарезервированы HTML-символы, что нарушает стандарт. HTML-кодирование сбежит '<' и ' > ' символы и HTML будут действительны, но после этого будет неожиданно '&' символов в URL-адресе (это зарезервированный символ для URL-адреса, он используется как разделитель параметров строки запроса).

Зарезервированные URL-адреса формирует надмножество зарезервированные символы HTML за исключением '<' и ' > ', которые зарезервированы для HTML, но не для URL.


ИЗМЕНИТЬ 2:

Я ошибался в отношении '<' и ' > ', они на самом деле являются процентами, экранированными кодировкой URL. Если это так, в этом случае достаточно кодирования URL, не так ли?

Ответ 1

Создайте URL как обычно. Следуйте правилам построения URL-адресов. Кодируйте данные, которые вы вставляете в него.

Затем построим HTML как нормальный. Следуйте правилам построения HTML. Кодируйте данные по мере их ввода.

то есть. Сделайте оба (но в правильном порядке).

Они не являются взаимоисключающими, поэтому нет противоречия.

Например (это упрощенный пример, предполагающий, что данные в $_GET верны и существуют, не делайте этого в реальном мире):

$search_term = $_GET['q'];
$page = $_GET['page'];
$next_page = $page + 1;
$next_page_url = 'http://example.com/search?q=' . urlencode($search_term) . '&page=' . urlencode($page);
$html = '<a href="' . htmlspecialchars($next_page_url) . '">link text</a>';