2013-07-29 17 views
7

Sembra che il codice PHP preg_match abbia un limite di 3276 caratteri per la corrispondenza di caratteri ripetuti in alcuni casi.PHP preg_match lunghezza 3276 limite

ossia

^(.|\s){0,3276}$ opere, ma ^(.|\s){0,3277}$ non lo fa.

Non sembra sempre applicabile, come funziona /^(.){0,3277}$/.

Non riesco a trovarlo menzionato nella documentazione di PHP o nel bug tracker. Il numero 3276 sembra un po 'strano, l'unica cosa che posso pensare è che è circa 1/10 di 32767, che è il limite per un intero con 16 bit con segno.

preg_last_error() ritorna 0.

ho riprodotto la questione sulla http://www.phpliveregex.com/ così come il mio sistema locale e il server web.

EDIT: Sembra che stiamo ottenendo "Warning: preg_match(): Compilazione non riuscita: espressione regolare è troppo grande all'offset 16" fuori dal codice, in modo che sembra essere lo stesso problema come PHP preg_match_all limit.

Tuttavia, la regex stessa non è molto grande ... PHP esegue qualche tipo di espansione quando si ripetono gruppi che lo rendono troppo grande?

+0

è più che probabile un limite di memoria, preg_match restituirà un array con tanti elementi quindi è necessario disporre di memoria sufficiente per consentire un array di grandi dimensioni, provare a superare il limite massimo di memoria e vedere se cambia. –

+1

Hai controllato 'preg_last_error()'? –

+0

indica il tuo errore? dovrebbe esserci qualche tipo di errore se si utilizza troppa memoria – x4rf41

risposta

0

Provare a utilizzare ^(.|\s){0,3276}(.|\s){0,1}$

1

Al fine di gestire le espressioni regolari compatibili con Perl, PHP fasci solo un third-party library che si prende cura del lavoro. Il comportamento descritto è in realtà documented:

Il quantificatore "*" equivale a {0,}, il "+" quantificatore a {1,} , e il "?" quantificatore a {0,1}. n e m sono limitati ai valori integrali non negativi inferiori a un limite preimpostato definito quando perl è stato creato. Questo di solito è 32766 sulle piattaforme più comuni.

Quindi c'è sempre un limite difficile. Perché i tuoi test suggeriscono che il limite PHP è 10 volte più piccolo di quello tipico? Nessuna idea a riguardo :)

+0

+1 perché questo è probabilmente il problema. Il limite più piccolo visto nella domanda si applica solo quando si combinano '.' e' \ s' in modo praticamente garantito per produrre grandi quantità di backtracking. Se supponiamo che il limite sia influenzato dal backtracking (che è un'ipotesi ragionevole), non sarebbe una sorpresa se il limite scendesse a questo livello. – Spudley