Úloha 11: Ověření rodného čísla (RČ)

Mírně pokročilý regulární výrazy checkdate() modulo 11 funkce

Cíl úlohy

Vytvořte funkci a formulář pro ověření platnosti českého a slovenského rodného čísla. Skript musí zkontrolovat syntaktický formát (s lomítkem i bez), ověřit kalendářní existenci data narození (včetně rozlišení mužů a žen) a pro desetimístná RČ ověřit kontrolní číslici dělitelností 11.

Struktura rodného čísla a kontrolní číslice

Rodné číslo má tvar RRMMDD/CCCC (devítimístné do roku 1953, desetimístné od 1. 1. 1954):

  • RR: Poslední dvojčíslí roku narození.
  • MM: Měsíc narození. U žen je k měsíci přičteno 50 (od roku 2004 v případě vyčerpání kapacit i 20 u mužů a 70 u žen).
  • DD: Den v měsíci (01–31).
  • CCCC: Koncovka. Desátá číslice je kontrolní: celé devítimístné číslo složené z RRMMDDCCC musí mít po dělení 11 zbytek rovný desáté číslici (pokud je zbytek 10, desátá číslice je 0).
c = ( RRMMDDCCC ) mod 11 (při zbytku 10 je c=0)

Úvahy a doporučený postup řešení

  • Regulární výraz: Pro rozparsování vstupu použijte funkci preg_match(), která umožní zadat rodné číslo s mezerami, lomítkem nebo bez něj.
  • Kontrola data: V PHP máme k dispozici vestavěnou funkci checkdate($mesic, $den, $rok). Před jejím voláním musíte od měsíce odečíst 50 (u žen) a správně určit století (např. 98 znamená 1998, 05 znamená 2005).
  • Dělitelnost 11: Operátor modulo % v PHP provede výpočet zbytku po celočíselném dělení.

Doplňující otázky k zamyšlení a náměty na rozšíření

  • 1. Jak z platného rodného čísla jednoduše zjistit pohlaví a přesný věk v rocích k dnešnímu dni?
  • 2. Proč nelze ověřit kontrolní číslici u devítimístných rodných čísel vydaných před rokem 1954?
  • 3. Proč se v moderních systémech a legislativě EU doporučuje rodná čísla nahrazovat bezvýznamovými identifikátory (BSI / klientskými identifikátory)?

Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu overeni_rc.php