Sobre este problema HTML
Num URL, o carácter # tem um papel especial: atua como o delimitador que separa o URL principal do identificador de fragmento. O fragmento geralmente aponta para uma secção específica ou elemento dentro do documento de destino, frequentemente correspondendo ao atributo id de um elemento. Porque # serve este propósito reservado, não pode aparecer mais do que uma vez na sua forma bruta dentro de um URL. Quando o validador encontra algo como ##pricing ou section#one#two, marca os caracteres # extra como ilegais.
Esta questão geralmente surge de um destes cenários comuns:
-
Erros de escrita — digitar acidentalmente
##em vez de#. -
Bugs de concatenação de strings — construir URLs programaticamente onde um
#é incluído tanto no URL base quanto anexado ao valor do fragmento. -
Erros de copiar-colar — duplicar o
#ao copiar URLs das barras de endereço do navegador ou outras fontes. -
#literal pretendido no fragmento — se realmente precisar de um símbolo#dentro do texto do fragmento, deve ser codificado por percentagem como%23.
Isto é importante porque os navegadores podem lidar com URLs mal formados de forma inconsistente. Alguns navegadores removem silenciosamente o # extra, enquanto outros podem falhar ao navegar para o fragmento pretendido. URLs mal formados também causam problemas para tecnologias assistivas, rastreadores web e qualquer ferramenta que analise links. Manter os seus URLs bem formados garante comportamento previsível em todos os agentes de utilizador e cumpre com o URL Standard e a especificação HTML.
Exemplos
Incorreto: # duplicado no URL
O duplo ## torna o identificador de fragmento inválido:
<a href="https://example.com/faqs##pricing">Pricing</a>
Correto: delimitador # único
Remova o # extra para que pricing seja o fragmento:
<a href="https://example.com/faqs#pricing">Pricing</a>
Incorreto: # extra dentro do fragmento
Aqui, a porção do fragmento overview#details contém um # bruto, que não é permitido:
<a href="/docs#overview#details">Details</a>
Correto: codificar o # literal por percentagem
Se realmente precisar de um # como parte do texto do fragmento, codifique-o como %23:
<a href="/docs#overview%23details">Details</a>
Na maioria dos casos, porém, este padrão sugere que a estrutura do URL deve ser repensada. Uma abordagem mais limpa é fazer link diretamente para o fragmento pretendido:
<a href="/docs#details">Details</a>
Incorreto: erro de concatenação programática
Um bug comum em templates ou JavaScript é anexar # quando a variável já o inclui:
<!-- Se definido como fragment = "#pricing", isto produz um duplo ## -->
<a href="https://example.com/faqs#pricing">Pricing</a>
Correto: garantir que apenas um # está presente
Certifique-se de que ou o URL base ou a variável de fragmento inclui o #, mas não ambos:
<a href="https://example.com/faqs#pricing">Pricing</a>
Links apenas de fragmento
Links apenas de fragmento (links para secções dentro da mesma página) seguem a mesma regra — apenas um #:
<!-- Incorreto -->
<a href="##contact">Contact Us</a>
<!-- Correto -->
<a href="#contact">Contact Us</a>
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.
Saiba mais: