Autor Zpráva
Darker
Profil
Regulární výrazy si vymýšlím v editoru psaném v javě.
^Location: ((http[s]?):\/\/)?([\w][\w.-]+[a-zA-Z0-9])?([\w/.-]+)?\??([^?&#\s]+)?#?([^#\s]+)?[ ]*$
Tento výraz tam funguje, a v hlavičkách najde případnou hlavičku location. V php jsem si mudel vystačit s tímto:
^Location: (.*?)$
Jan Tvrdík
Profil
Darker:
Zvláštní, mně v PHP ten regulární výraz normálně funguje:
<?php
$s = 'Location: http://example.com';
$re = '~^Location: ((http[s]?):\/\/)?([\w][\w.-]+[a-zA-Z0-9])?([\w/.-]+)?\??([^?&#\s]+)?#?([^#\s]+)?[ ]*$~';

var_dump(preg_match($re, $s));
Darker
Profil
Jan Tvrdík:
Zvláštní
Zas tak ne, on by totiž fungovat měl. Takže chyba bude někde jinde, což je to, čeho jsem se nejvíc obával.
Keeehi
Profil
Darker:
Nevím, s čím máš problém. Ten druhý regulár je prostě více obecný a projde jím i "Location: tohle teda určitě není url :-)". Ten první k tomu navíc kontroluje i to, zda je tam adresa. Navíc, pokud se nepletu, tak adresa example.com?a=&b=#c jím neprojde.
midlan
Profil
Darker:
Nevím jestli to způsobuje onu chybu, ale proč máš zpětná lomítka před normálními lomítky?
Jan Tvrdík
Profil
midlan:
proč máš zpětná lomítka před normálními lomítky?
Navíc jen před některými.
Keeehi
Profil
midlan:
Protože ten regulár, co dal Darker, není úplný. On kolem něj měl nejspíše právě ty lomítka a proto je musel escapovat. Jan Tvrdík použil kolem vlnovku a proto by ty lomítka už escapovaná být nemusela, ale i tak tam nevadí. Příklad od Jan Tvrdík je plně funkční.

EDIT
Navíc jen před některými.
Toho jsem si ani nevšiml. Pak tedy první dvě věty neplatí.
Jan Tvrdík
Profil
Keeehi:
Toho jsem si ani nevšiml. Pak tedy první dvě věty neplatí.
Já bych řekl, že ty tvoje první dvě věty platí a to, že to jedno lomítko není escapované, je příčinou toho problému.
Darker
Profil
Nějak jsem si navykl (asi z javascriptu) vždycky escapovat lomítka mimo [...]. Jinak jsem použil vlnovky stejně jako Jan Tvrdík

Keeehi:
Nevím, s čím máš problém.
Nakonec jsem se s benevolentností reguláru smířil. Jde o to, že takhle musím URL stejně parsovat a kontrolovat a pokud zjistím, že to url není musím vycouvávat z IFu, do kterého jsem se zbytečně dostal tím regulárem, který požere všechno.

adresa example.com?a=&b=#c jím neprojde.
Projde. Ale asi ne tak, jak by měla.
Keeehi
Profil
Neprojde
<?php
$s = 'Location: example.com?a=&b=#c';
$re = '~^Location: ((http[s]?):\/\/)?([\w][\w.-]+[a-zA-Z0-9])?([\w/.-]+)?\??([^?&#\s]+)?#?([^#\s]+)?[ ]*$~';
 
var_dump(preg_match($re, $s)); // int(0)
Darker
Profil
Špatně jsem to zkoušel, použil jsem jen ten regulár bez vymezovačů začátku a konce.
Keeehi
Profil
Ono je docela těžké napsat regulár na validitu odkazu, protože díky mod_rewrite můžou být za doménou a následným lomítkem opravdová zvěrstva.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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