Parsování URL v JavaScriptu

V případě, že máme URL a potřebujeme z ní JavaScriptem získat jednotlivé části jako například:

  • protokol,
  • název domény,
  • cestu k souboru,
  • parametry za otazníkem (query string),
  • hash (obsah za #)

Je řešení buď používat regulární výrazy, nebo využít toho, že všechny tyto údaje umí JavaScript snadno vytáhnout ze značky <a>.

V prohlížečích novějších než IE 11, jde použít rovnou URL API.

Vytvoříme-li proto odkaz a nastavíme-li mu požadovanou URL, potřebné údaje získáme velmi elegantně.

var adresa = "http://example.com/cesta/skritp.php?promena=1#kotva";
var odkaz = document.createElement("a");
odkaz.href = adresa;

protocol

Bude dostupný ve vlastnosti odkaz.protocol, zpravidla http: nebo https: (včetně dvojtečky).

hostname

Název domény bude v odkaz.hostname.

pathname

Cesta ke skriptu – odkaz.pathname.

Obsah za otazníkem – odkaz.search.

hash

Obsah za mřížkou včetně té mřížky – odkaz.hash.

port

Získat je možné i port (je-li uveden v URL) – odkaz.port. To ale bývá velmi zřídka.

Zjednodušená ukázka pro testování ve starých prohlížečích.

URL API

V nových prohlížečích (mimo IE) existuje URL API. Tím odpadá potřeba parsovat URL přes vytváření odkazu, ale jde jít hezky na přímo.

const url = new URL("http://example.com:8080/cesta/skript.php?promena=1#kotva")

Výstupem je:

hash: "#kotva"
host: "example.com:8080"
hostname: "example.com"
href: "http://example.com:8080/cesta/skript.php?promena=1#kotva"
origin: "http://example.com:8080"
password: ""
pathname: "/cesta/skript.php"
port: "8080"
protocol: "http:"
search: "?promena=1"
searchParams: URLSearchParams {}
username: ""

Pokud parametr předávaný do URL nemusí být validní, nabízí se to celé obalit do trycatch bloku:

Přísnější validace URL tak může vypadat třeba takto:

export const validateUrl = (webUrl: string) => {
  try {
    const url = new URL(webUrl)

    const isProtocolValid = ['http:', 'https:'].includes(url.protocol)

    const hostnameParts = url.hostname.split('.')
    const isTldExist = hostnameParts.filter(part => part.length > 0).length > 1

    const tld = hostnameParts[hostnameParts.length - 1]
    const isTldNaN = isNaN(parseInt(tld))

    const isTldTwoMoreChars = tld.length >= 2

    return isProtocolValid && isTldExist && isTldNaN && isTldTwoMoreChars
  } catch (_e) {
    return false
  }
}  

Punycode

Punycode je zjednodušeně řečeno převod diakritiky v doméně na základní (ASCII) znaky.

Funkce URL to dělá automaticky. Takže z domény obsahující é (e s čárkou) https://éxample.com vznikne https://xn--xample-9ua.com/.

Takovou doménu jde detakovat třeba pomocí podmínky:

if (url.hostname.includes('xn--'))

Parsování URL v PHP

V jazyku PHP k parsování adres slouží funkce parse_url.

To je všechno. Líbil se vám článek a chcete se dozvědět, až vyjde další?

Sledujte:

 

Připomínky mi pište do komentářů ↓

Jak vytvořit WYSIWYG editor

Vlastní jednoduchý WYSIWYG editor

Chceme-li na webu zadávat text a běžná <textarea> už nestačí, řešením je napsat si vlastní WYSIWYG editor.

Detekce zapnutého JavaScriptu

Zapnutý a vypnutý JavaScript

Jak na webové stránce detekovat zapnuté nebo vypnuté skriptování.

CSS vyhledávání a filtrování

CSS vyhledávání a filtrování obsahu

Jak pomocí CSS se špetkou JS filtrovat obsah stránky nebo na ní vyhledávat.

Upozornění před opuštěním stránky

Upozornění před zavřením stránky

Javascriptová událost onbeforeunload umožňuje pozastavit uzavření/obnovení stránky.

Plynulý přesun focusu

Plynulý přesun focusu

Plynulé přesouvání focusu mezi jednotlivými položkami formuláře.

Komentáře