Comment convertir les expressions ereg en preg en PHP?
depuis que les expressions régulières POSIX (ereg) sont dépréciées depuis PHP 5.3.0, j'aimerais savoir un moyen facile de convertir les anciennes expressions en PCRE (Perl compatible Regular Expressions) (preg) .
par exemple, j'ai cette expression régulière:
eregi('^hello world');
Comment puis-je traduire des expressions en des expressions compatibles preg_match
?
Note: ce post Sert de placeholder pour tous les postes liés à la conversion d'ereg en preg, et comme un duplicate options pour les questions connexes. s'il vous Plaît ne fermez pas cette question.
Related:
- Comment changer de PHP eregi à preg_match
- changement de lieu à lieu à lieu équivalent
4 réponses
le plus grand changement de syntaxe est l'ajout de délimiteurs .
ereg('^hello', $str);
preg_match('/^hello/', $str);
délimiteurs peuvent être à peu près tout ce qui n'est pas alpha-numérique, un antislash ou un caractère d'espace. Les plus utilisées sont généralement ~
, /
et #
.
vous pouvez également utiliser les crochets correspondants:
preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc
Si votre délimiteur se trouve dans l'expression régulière, vous doivent y échapper:
ereg('^/hello', $str);
preg_match('/^\/hello/', $str);
vous pouvez facilement échapper à tous les délimiteurs et caractères réservés dans une chaîne de caractères en utilisant preg_quote :
$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);
aussi, PCRE soutient modificateurs pour diverses choses. L'un des plus utilisés est le modificateur non sensible à la casse i
, l'alternative à eregi :
eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');
vous pouvez trouver le une référence complète à la syntaxe PCRE en PHP dans le manuel , ainsi qu'une liste de différences entre POSIX regex et PCRE pour aider à convertir l'expression.
cependant, dans votre exemple simple, vous n'utiliserez pas une expression régulière:
stripos($str, 'hello world') === 0
ereg remplacement par preg (à partir de PHP 5.3.0) était le bon choix en notre faveur.
preg_match, qui utilise une syntaxe D'expression régulière compatible Perl, est souvent une alternative plus rapide à ereg.
vous devez savoir 4 choses principales à port ereg patterns à preg:
-
ajouter des délimiteurs (/):
'pattern' => '/pattern/'
-
délimiteur D'échappement si elle fait partie du motif:
'patt/ern' => '/patt\/ern/'
Le réaliser programmatiquement de la manière suivante:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
-
eregi (correspondance non sensible à la casse):
'pattern' => '/pattern/i'
Donc, si vous utilisez la fonction eregi pour l'appariement insensitif de cas, il suffit d'ajouter "i" à la fin du nouveau modèle('/pattern/'). -
valeurs ASCII : dans ereg, si vous utilisez le nombre dans le modèle, il est supposé que vous faites référence à L'ASCII d'un caractère. Mais en prég, le nombre n'est pas considéré comme une valeur ASCII. Ainsi, si votre motif contient une valeur ASCII dans l'expression ereg (par exemple: nouvelle ligne, onglets, etc.), convertissez-le en hexadécimal et préfixez-le avec \x.
Example: 9(tab) becomes \x9 or alternatively use \t.
à Partir de la version de PHP 5.3, ereg
est obsolète.
passer de ereg
à preg_match
n'est qu'un petit changement dans notre schéma.
tout D'abord, vous devez ajouter des délimiteurs à votre code, par exemple:
ereg('A-Z0-9a-z', 'string');
à
preg_match('/A-Z0-9a-z/', 'string');
pour eregi
correspondance non sensible à la casse, mettre i
après le dernier délimiteur, p.ex.:
eregi('pattern', 'string');
à
preg_match ('/pattern/i', 'string');
il y a plus de différences entre ereg()
et preg_replace()
que seulement la syntaxe:
-
valeur de retour:
- erreur : return
FALSE
- , aucun match :
ereg()
renvoieFALSE
,preg_match()
renvoie0
- match :
ereg()
renvoie la longueur de chaîne ou1
,preg_match()
renvoie toujours1
- erreur : return
-
tableau résultant de substrats appariés: si certains substrats ne sont pas trouvés du tout (
(b)
dans...a(b)?
), l'élément correspondant dansereg()
résultat seraFALSE
, tandis que danspreg_match()
il ne sera pas défini du tout.
Si l'on est pas assez courageux pour convertir son ou son ereg()
à preg_match()
, il ou elle peut utiliser mb_ereg () , qui est encore disponible en PHP 7.