Autor Zpráva
Marek Štafl
Profil
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);
v souvislosti s tímto souborem: testy.marextafl.cz/ah_index.html
(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
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');
nastavit na 1000000, což je výchozí hodnota pro PHP=>5.3.7 a už to funguje :)
Keeehi
Profil
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
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í :)

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: