PHP, et les PCRE qui ne fonctionnent plus

Logo PHP

Attention, ce qui suit ne s'adresse qu'aux développeurs PHP. Qui utilisent les PCRE (Expressions rationnelles compatibles Perl). Qui manipulent de très gros fichiers (par exemple des bons gros fichiers XML à analyser)

Depuis PHP 5.2.0, il existe une nouvelle option de configuration dans le php.ini, concernant les PCRE :

pcre.backtrack_limit

Cette option de configuration, définie par défaut à 100 000, détermine la longueur maximale des chaines à traiter et à retourner par les fonctions PCRE PHP (preg_match, entre autres).

Concrètement, si vous avez un fichier de 50 Mo à analyser en PHP (en CLI hein, pas via Apache, ne soyez tout de même pas trop barbare), et que les blocs que vous cherchez à extraire via une RegExp font plus 100 Ko, cette limitation vous empêchera de les avoir.

Le pire, dans tout ça, c'est qu'aucune alerte ni même notice ne vous est renvoyée. Rien. Que dalle. Nada.

Seul moyen de vérifier ça ? Placer un appel à la fonction preg_last_error() après chaque RegExp. Lourd, et inutile, à mon sens.

Maintenant, je comprends mieux pourquoi mon catalogue produit ne retrournait qu'un seul élement, au lieu des 350 présent réellement dedans.

Maintenant, vous êtes au courant, ça vous évitera de perdre 2 bonnes heures à chercher où ça coince ;) (comment ça, c'est du vécu ?)

Temps de lecture : 1 minute