PHP Velho Oeste 2024

Differences avec les regex POSIX

Depuis PHP 5.3.0, l'extension des Regex POSIX est obsolète. Il y a un certain nombre de différences entre les regex POSIX et PCRE. Cette page liste les plus remarquables qu'il faut connaitre pour passer de l'un à lautre.

  1. Les fonctions PCRE demandent à ce que le motif soit entouré de délimiteurs.
  2. A la différence de POSIX, l'extension PCRE n'a pas de fonctions dédiées à la correspondance insensible à la casse. Au lieu de cela, il faut utiliser modificateur i. D'autres modificateurs sont aussi disponibles.
  3. Les fonctions POSIX trouvent l'occurence la plus longue en partant de la gauche, mais PCRE s'arrête dès correspondance avec la première occurence. Si la chaine n'a aucune correspondance, cela ne crée pas de différence mais si il y a correspondance, cela peut avoir des effets importants sur le resultat trouvé et le temps de recherche du motif. Pour illustrer cette différence, considérons l'exemple suivant tiré de "Mastering Regular Expressions" par Jeffrey Friedl. L'utilisation du motif one(self)?(selfsufficient)? sur la chaine oneselfsufficient avec PCRE donnera un résultat oneself, mais avec POSIX le résultat sera toute la chaine oneselfsufficient. Les deux sous-chaines correspondent à la chaine originale, mais POSIX utilise la plus longue comme résultat.
  4. La définition POSIX d'une "classe de caractères" diffère de celle en PCRE. Les expressions entre crochets pour trouver un jeu de caracères explicites sont supportées sous la forme PCRE d'une classe de caractères mais la forme POSIX de collection d'éléments, de classes de caractères n'est pas supportée. Le fait de fournir une expression avec une classe de caractères qui commence et qui se termine par le caractère :, . ou par le caractère = à PCRE est interprété comme une tentative d'utilisation d'une de ces fonctionalités non supportées et résultera en une erreur de compilation.

Remplacements de fonctions
POSIX PCRE
ereg_replace() preg_replace()
ereg() preg_match()
eregi_replace() preg_replace()
eregi() preg_match()
split() preg_split()
spliti() preg_split()
sql_regcase() No equivalent

add a note add a note

User Contributed Notes 2 notes

up
1
cdragon at dracoventions dot com
10 years ago
In regards to the previous comment that says "there are several other differences including different meaning for the symbols  ( [ different rules for which symbols need escaping", as far as I can tell from reading
http://www.tin.org/bin/man.cgi?section=7&topic=regex
there are absolutely no "other differences" except in what the man page calls "Obsolete  ("basic'')  regular  expressions".  However, PHP doesn't appear to use the obsolete form of expressions in its POSIX functions.

PCRE even supports all of the POSIX named character classes such as [:space:].
up
0
jasen at treshna dot com
12 years ago
there are several other differences

including different meaning for the symbols  ( [
different rules for which symbols need escaping (they can't be the same as both standard posix and extended posix)

you should read the full documentation for PCRE before chaging any posix regex to use pcre.
To Top