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]+)?[ ]*$ ^Location: (.*?)$ |
||
Jan Tvrdík Profil |
#2 · Zasláno: 12. 7. 2012, 21:24:58
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 |
#3 · Zasláno: 12. 7. 2012, 21:43:20
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 |
#4 · Zasláno: 12. 7. 2012, 21:55:47
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 |
#5 · Zasláno: 12. 7. 2012, 23:27:44
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 |
#6 · Zasláno: 12. 7. 2012, 23:32:27
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 |
#9 · Zasláno: 13. 7. 2012, 21:51:09
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 |
#10 · Zasláno: 13. 7. 2012, 22:07:18
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 |
#11 · Zasláno: 13. 7. 2012, 22:21:54
Špatně jsem to zkoušel, použil jsem jen ten regulár bez vymezovačů začátku a konce.
|
||
Keeehi Profil |
#12 · Zasláno: 13. 7. 2012, 22:25:44
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.
|
||
Časová prodleva: 11 let
|
0