Autor Zpráva
Martin Joneš
Profil
Používám klasické [a-zA-Z] a protože jsem tam chtěl mít českou diakritiku, vložil jsem tam všechny české symboly s diakritikou. Teď ale nastává ten problém. Všechny znaky fungují, ale když tam připíšu Š tak to hází 500 error. Malé š funguje, ale veliké ne. Nadále bych chtěl mít ten kód co nejkratší a vypisovat se s každým písmenkem by bylo nehezké. A co nějaká zahraniční diakritika? To by bylo o dalších znaků navíc. Takže mě napadlo, že bych si udělal regex na způsob vše, jen ne číslo (tudíž by to bylo a-z i se speciálními znaky). Teď je ale problém, co když to bude lomítko / nebo ? či %? Které znaky bych měl vyloučit stejně, jako čísla, aby to nedělalo neplechu? Děkuju všem za odpovědi.
EDIT: představuji si to, aby to bylo jako na Wikipedii. Ta podporuje i znaky jiných jazyků, o kterých jsem nikdy neslyšel.
M4n
Profil *
Martin Joneš:
Diakritika v URL
Diakritiku (a ostatní unicode znaky) v URL lze používat prakticky bez omezení. Non-latin znaky se vždy enkódují – v případě domény formou IDN, zbytek adresy formou URL-encoded.

Zbytek příspěvku
Jaký regulár, jaký error 500 ... zkus to napsat znovu a neplácat páté přes deváté.
Martin Joneš
Profil
M4n:
[A-Za-zĚŠČŘŽÝÁÍÉŇÓÚŮŤĎěščřžýáíéňťďóúů] - nefunguje
[A-Za-zĚČŘŽÝÁÍÉŇÓÚŮŤĎěščřžýáíéňťďóúů] - funguje (není zde velké Š)
Error 500 mi hází přímo Apache.
.htaccess mám na UTF-8 a žádné BOM znaky v něm nejsou.
Kajman
Profil
To máte v RewriteRule, nebo kde? Můžete ten kód ukázat celý?

Proč nepřepíšete univerzálně .*?
Martin Joneš
Profil
Kajman:
Ano, jako rewrite rule. Celý kód je nepodstatný. Podle pravidel se URL rozdělí do různých parametrů, které pomocí $_GET zpracovává můj index. Jde o to, že ty regular expressions nefungují s charakterem "Š"
_es
Profil
Martin Joneš:
Jde o to, že ty regular expressions nefungují s charakterem "Š"
Ako, kde, čo, konkrétne, nefunguje?
Asi máš tie „regular expressions“ nejako zle, použi podľa rady v [#2] M4n URL kódování.
Napríklad v odkaze cs.wikipedia.org/wiki/%C5%A0pan%C4%9Blsko je „Š“ ako „%C5%A0“.
Martin Joneš
Profil
_es:
Mam to na localhostu, doména přes WEDOS. Všechno funguje jak má, jenže nemůžu zapsat pravidlo, že na daném místě v patternu URL může být velké Š. Prostě to je jediný znak, který když tam dopíšu, tak to hází internal error 500. Ne že by to nešlo, když do URL zapíšu "Š" - aby jsme se správně chápali. Po přidání "Š" do regex ho prostě htaccess vyhodnotí jako špatný, nebo já nevím. Nemůže to byt třeba bug v Apache?
Nemůžou být zle, když kód neměním a jen připíšu jeden znak. Bum, přidám tam "Š" a nefunguje. Odebere, funguje.
Používám Chrome a znaky se mi nezakódovávají. Zůstávají, jak jsou.
Keeehi
Profil
Já bych se vrátil k tomu co psal Kajman > „Proč nepřepíšete univerzálně .*?
Martin Joneš
Profil
Keeehi:
Nehodí se. Opakuji, že záleží na patternu URL. Pokud bude třeba example.com/foo a example.com/foo/bar a example.com/foo/2 Tak pokaždý mi htaccess vyhodnotí, jakému pravidlu odpovídá a přepíše mi to jako parametry URL. A pokaždý, podle patternu vyhodnotí tu hodnotu jako jinou $_GET proměnnou. Prostě se to nehodí na tenhle případ.
A nesouvisí to s otázkou. Mě hlavně zajímá, proč Š jako jediný charakter dělá neplechu. Je snad kódováním nějak odlišný, než jakýkoliv jiný český charakter s diakritikou?
M4n
Profil *
Martin Joneš:
Oni Keeehi a Kajman se ti jen snaží naznačit, že to děláš blbě. Veškeré routování má mít na starosti jeden endpoint. Ten podle svých vlastních pravidel vyparsuje proměnné, zajistí kanonizaci a zavolá patřičné presentery. Jiný způsob se dnes prakticky nepoužívá. A to obecně, ne jen v případě PHP.

Nemám úplně zkušenosti s UTF-8 v regulárních výrazech modulu rewrite, ale můj tip je, že vícebajtové znaky rewrite regulár vůbec nezvládne a tedy bys je měl zapsat pomocí escape sekvencí. Případně invertovat třídu a místo toho nesmyslného výčtu jen zakázat řídicí znaky, jako lomítka, a zbytek povolit.

Používám Chrome a znaky se mi nezakódovávají. Zůstávají, jak jsou.
To nic neznamená, URL je vždycky escapovaná. To co ti prohlížeč zobrazí není vůbec relevantní.
Martin Joneš
Profil
M4n:
Znak "Š" jsem zkoušel excapnout "\Š" ale bez efektu.
Jen je zvláštní, že jiné znaky, jako třeba "ť" fungují
Davex
Profil
Martin Joneš:
Mně to s Š funguje. Nekoliduje ti to třeba s nějakým jiným pravidlem nebo jak to vlastně používáš? Když zapneš debug mód mod_rewrite, tak jaké podrobnosti k chybě 500 se zapíšou do logu?
M4n
Profil *
Martin Joneš:
Znak "Š" jsem zkoušel excapnout "\Š" ale bez efektu.
Ono taky \Š není escape sekvence ničeho.
Martin Joneš
Profil
M4n:
Nemám úplně zkušenosti s UTF-8 v regulárních výrazech modulu rewrite, ale můj tip je, že vícebajtové znaky rewrite regulár vůbec nezvládne a tedy bys je měl zapsat pomocí escape sekvencí.
Vždyť já vím. Ale když jsem našel chybu přesně v tom znaku, zkusil jsem dát před něj lomítko. A escape sekvenci jsem pochopil jako "\n" apod.


Nikdy jsem o tom neslyšel a celkem dlouho jsem hledal, jestli to vůbec existuje, načež každý odpovídal, že diakritické znaky se musí vypisovat každý zvlášť. Ale zkusil jsem a doopravdy toto funguje. :D
[A-Za-zÀ-ž0-9] Vcelku překvapen. Omlouvám se za tak rozsáhlé vlákno. Víc než 3 odpovědi mít nemělo.
Keeehi
Profil
Martin Joneš:
každý odpovídal, že diakritické znaky se musí vypisovat každý zvlášť
A měli pravdu. Protože À-ž kromě toho že povoluje některé znaky s diakritikou, tak zároveň povoluje i jiné znaky, jako třeba × a ÷. Naopak třeba ǎ nepovoluje.
Martin Joneš
Profil
Keeehi:
Kde najdu nějakou tabulku všech znaků a jejich index? Nebo pořadové číslo? Abych věděl, které znaky jsou mezi À-ž?
Keeehi
Profil
Martin Joneš:
<?php
function unichr($u) {
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}

$start = 192;
$end   = 382;
$modul = 10;

for($i = $start; $i <= $end; $i++) {
    echo unichr($i).(($i+1)%$modul == $start%$modul ? "<br>" : "");
}
Úpravou $start a $end si můžeš zobrazit jakoukoli část tabulky

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: