Ja regulārā ekspresija pēkšņi nestrādā
15. June, 2009, 10:55 UncategorizedTad ļoti iespējams, ka cenšaties to izpildīt “uz” pārāk liela teksta. Nesen saskāros ar problēmu, kad regulārā ekspresija, kas pārsēja vienas mājas lapas HTML, dažās situācijās vienkārši neatrada neko (izmantoju preg_match() funkciju). Neizmeta ne kļūdu, ne arī ko citu. Tikai tukšs rezultāts. Nedaudz padebugojot, atklāju, ka tas notiek, ja HTML ir ļooti liels.
Tālāk jau nedaudz pagūglējot, atklājās, ka PHP izmantotais PCRE pakļaujas man īsti neizprotamiem pcre.backtrack_limit un pcre.recursion_limit uzstādījumiem php.ini failā. Īsumā un neprecīzi - tas ir kaut kā saistīts ar to, cik PCRE drīkst izmantot resursus, pārsējot teksta stringu. Ja limits tik sasniegts, pārsēšana pārtrūkst pusceļā.
Risinājums vienkāršs - palielināt šos limitus. Noklusētie PCRE internālie limiti laikam ir 10000000, bet PHP noklusēti tos pārraksta uz 100000, tāpēc var mēģināt PHP uzstādījumos norādīt tādus pašus ciparus, kādi ir PCRE internālie. Bet dariet to piesardzīgi, jo riskējat tādējādi nokarināt pašu PHP, ja limiti būs par lielu.


15. June, 2009, 13:58
Vai arī cits risinājums - rakstīt regexpu, kas neizmanto (vai izmanto pēc iespējas mazāk) backtreisingu: http://www.regular-expressions.info/catastrophic.html
Vairāk uz implementāciju tēmēts links: http://swtch.com/~rsc/regexp/regexp1.html
Gan ātrums būs labāks, gan atmiņu mazāk tērēs.
16. June, 2009, 18:21
Vai varbūt pārsēt HTMLu ar tam paredzētām funkcijām (SimpleXML, DOM), nevis regex? Ok, es pieņemu, ka bija labs iemesls darīt tā kā izdarīji.
20. July, 2010, 0:42
Nez vai šis blogs vēl dzīvs. Pēdējais ieraksts vairāk kā gadu atpakaļ.
14. August, 2010, 14:13
Jap, miris gan…