Autor | Zpráva | ||
---|---|---|---|
Marek Štafl Profil |
#1 · Zasláno: 23. 2. 2017, 02:17:16
Zdravím,
může mi někdo poradit, co mám špatně na tomto reguláru: preg_match('#^(.*)(<head>(.*)<title>(.*)</title>(.*)</head>\s*<body>)(.*)(</body>(.*))$#ims', $data, $parsed); (proměnná $data obsahuje soubor načtený pomocí funkce file_get_contents() )
Problém je, že na localhostu (PHP 5.6.26) to funguje, ale na webu (PHP 5.2.0-8+etch10) ne. Trochu mi to nejde do hlavy. |
||
Keeehi Profil |
#2 · Zasláno: 23. 2. 2017, 03:06:48
Myslím, že chyba bude asi někde jinde. Ten regulární funguje stejně už od mnohem starších verzi. 3v4l.org/EHGH4
Začal bych tím, že bych ověřil, zda v proměnné $data je stejný text na obou systémech. Nejjednodušší bude spočítat hash (md5 stačí) a oba porovnat. Pokud se budou lišit, pak to znamená, že server má jiná data než co máš na localu. |
||
Marek Štafl Profil |
Tak ten hash je naprosto stejný. Já to fakt nechápu... :(
Tak jsem na to přišel. Je to velikostí zpracovávaných dat. Funkce preg_last_error() vrací 2, což je PREG_BACKTRACK_LIMIT_ERROR , jenže ten by podle tohohle, měl být defaultně 100000 na PHP<5.3.7. Když si nechám vypsat strlen($data) , vrátí 86249, což by se do toho limitu pořád mělo vejít, ne?!. Ve výpisu phpinfo() jsem tuto hodnotu vůbec nenašel. Dá se to nějak upravit pomocí ini_set() , nebo dá se s tím dělat něco jiného?
Tak jo, povedlo se mi to pomocí ini_set('pcre.backtrack_limit', '1000000'); |
||
Keeehi Profil |
#4 · Zasláno: 23. 2. 2017, 13:23:13
Marek Štafl:
Jenom taková otázka na závěr. Proč používáš zrovna regulární výrazy? Nic speciálního v něm nepoužíváš. To samé by šlo napsat pomocí substr a strpos. A navíc je dost možné, že by to bylo rychlejší a hlavně nezávislé na limitech. |
||
Marek Štafl Profil |
#5 · Zasláno: 23. 2. 2017, 14:50:54
Keeehi:
No já z toho předně potřebuji vytáhnout text mezi <title> a </title> a vše mezi <body> a </body> , ale zároveň potřebuji i ty zbytky ostatních částí, abych to mohl potom po úpravě těch vytažených částí zase slepit dohromady a zůstalo to víceméně v původním stavu. Souborů na které to používám je trochu víc a každý má trochu jinou stavbu.
Na druhou stranu by ty dvě zmíněné funkce asi použít šlo, ale v okamžiku, kdy jsem to vytvářel, mě to nenapadlo :) Ten zápis s jedním regulárem mi přišel jednodušší a o těch limitech jsem do včerejška neměl tušení :) |
||
Časová prodleva: 6 let
|
0