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
120
demandé sur Community 2011-06-07 22:36:50

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
118
répondu netcoder 2017-08-17 20:01:09

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:

  1. ajouter des délimiteurs (/): 'pattern' => '/pattern/'

  2. 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, '/') . '/';

  3. 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/').

  4. 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.

27
répondu Sumoanand 2017-09-25 20:12:08

à 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');
4
répondu Narayan 2018-07-19 13:38:30

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() renvoie FALSE , preg_match() renvoie 0
    • match : ereg() renvoie la longueur de chaîne ou 1 , preg_match() renvoie toujours 1
  • 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 dans ereg() résultat sera FALSE , tandis que dans preg_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.

3
répondu Roman Hocke 2016-12-01 15:42:23