Php – preg_match : recherches multi-lignes et insensibles à la casse (eregi)

Ou comment passer de la fonction eregi à la fonction preg_match.

Jusqu’à présent, au boulot, notre serveur web tournait sur Php 5.2. Une migration vers Php 5.4 est imminente mais nous avons encore certains (très vieux) scripts qui tournent avec des fonctions devenues obsolètes dès la version 5.3.

Parmi ces fonctions passées de vie à trépas, il y a la fonction eregi.

La documentation PHP indique qu’il suffit de remplacer eregi par preg_match en ajoutant le paramètre i.

On pourrait donc penser qu’il suffit de remplacer :

eregi($pattern, $subject, $matches);

 

Par :

preg_match($pattern.'i', $subject, $matches);

 

En fait, ce n’est pas suffisant. Tout d’abord, il faut savoir que la fonction preg_match nécessite des délimiteurs. Vous pouvez librement les choisir. Personnellement, j’ai opté pour ~ car mon preg_match va traiter des portions de code Html. Cela m’évitera donc de devoir échapper le délimiteur. Ensuite, vu la nature de ma chaîne d’entrée (Html), il me faut un traitement multi-lignes. Je vais donc ajouter l’option de recherche (Pattern Modifier) s en plus de l’option i qui, je le rappelle, rend la recherche insensible à la casse (le même i qu’à la fin de eregi).

 

Au final, la fonction eregi doit être remplacée par :

preg_match('~'.$pattern.'~is', $subject, $matches);

 

Je résume. Pour passer de la fonction eregi à preg_match, il faut :

  • ajouter un délimiteur (par exemple : ~ ou # ou / ou ! ou autre)
  • ajouter l’option i pour une recherche insensible à la casse
  • ajouter l’option s pour une recherche sur plusieurs lignes

Et le tour est joué ^^

 

Source : http://stackoverflow.com/questions/12667369/php-preg-match-not-matching-past-line-breaks