147 votes

Comment convertir les expressions ereg en preg en PHP ?

Desde Expressions régulières POSIX (ereg) sont dépréciées depuis PHP 5.3.0, j'aimerais connaître un moyen simple de convertir les anciennes expressions en PCRE (Expressions régulières compatibles avec Perl) (preg) .

Par exemple, j'ai cette expression régulière :

eregi('^hello world');

Comment traduire des expressions en preg_match des expressions compatibles ?

Nota: Ce billet sert de support à tous les billets relatifs à la conversion d'ereg en preg, et d'option de duplication pour les questions connexes. Veuillez ne pas fermer cette question.

En rapport :

2 votes

@yes123 : Oui, c'est le problème, j'en suis aussi fatigué. Je veux un post wiki qui explique réellement quelque chose afin que nous puissions fermer toutes ces questions individuelles.

0 votes

Je pense que ce n'est pas nécessaire car il suffit d'entourer l'ancien avec un délimiteur. Je pense également que vous auriez pu utiliser une question à laquelle vous avez déjà répondu pour cela.

0 votes

Ah, j'ai voté pour une fermeture avant de lire les commentaires. En tant qu'espace réservé, il pourrait servir à quelque chose, mais n'y a-t-il pas une autre question plus ancienne qui aurait pu servir à cela ?

146voto

netcoder Points 31874

Le plus grand changement dans la syntaxe est l'ajout de la fonction délimiteurs .

ereg('^hello', $str);
preg_match('/^hello/', $str);

Les délimiteurs peuvent être à peu près tout ce qui n'est pas alphanumérique, une barre oblique inversée ou un caractère d'espacement. Les plus utilisés sont généralement ~ , / y # .

Vous pouvez également utiliser des parenthèses assorties :

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc

Si votre délimiteur est trouvé dans l'expression régulière, vous devez l'échapper :

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);

Vous pouvez facilement échapper à tous les délimiteurs et caractères réservés d'une chaîne de caractères en utilisant la commande preg_quote :

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

De plus, PCRE supporte modificateurs pour diverses choses. L'un des plus utilisés est le modificateur insensible à la casse i l'alternative à eregi :

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

Vous pouvez trouver la référence complète à Syntaxe PCRE en PHP dans le manuel ainsi qu'un liste des différences entre POSIX regex et PCRE pour aider à convertir l'expression.

Toutefois, dans votre exemple simple, vous n'utiliseriez pas d'expression régulière :

stripos($str, 'hello world') === 0

2 votes

Merveilleuse explication ! J'aimerais juste ajouter un cas spécial dans lequel vous convertissez de l'anglais à l'espagnol. ereg a preg_match et vous devez échapper seulement les délimiteurs et pas les caractères réservés (parce qu'ils fonctionnaient déjà comme des caractères spéciaux, nous ne voulons pas les échapper) : preg_match('/'.str_replace('/','\/',$expr).'/', $str) ;

0 votes

Il est particulièrement intéressant de noter que si vous utilisez des parenthèses correspondantes, alors vous Ne le fais pas. Il n'est pas nécessaire d'échapper aux caractères "juste parce que c'est le même que le délimiteur", comme vous le faites avec d'autres symboles tels que le symbole /^\/hello/ exemple. (a(b)c) est un PCRE parfaitement valide et délimité. Personnellement, j'aime utiliser les parenthèses () pour me rappeler que le premier match capturé est le tout.

0 votes

Comment convertir ceci ? $regex = $e . '(( \. [^ \. ' . $e . '][^' . $e . ']*)|( \.\. [^' . $e . ']+)|([^ \. ][^' . $e . ']*)" . $e . ' \.\. ' . $e ; à preg_math il ne fonctionne pas en ajoutant simplement le modificateur / /.

33voto

Sumoanand Points 3387

Le remplacement d'Ereg par preg (à partir de PHP 5.3.0) a été une bonne décision pour nous.

preg_match, qui utilise une syntaxe d'expression régulière compatible avec Perl, est souvent une alternative plus rapide à ereg.

Vous devez savoir 4 choses principales pour porter les modèles d'ereg à preg :

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

  2. Délimiteur d'échappement s'il fait partie du motif : 'patt/ern' => '/patt\/ern/'
    Réalisez-le de manière programmatique de la façon suivante :
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (correspondance insensible à la casse) : 'pattern' => '/pattern/i' Ainsi, si vous utilisez la fonction eregi pour une correspondance insensible à la casse, ajoutez simplement 'i' à la fin de new pattern('/pattern/').

  4. Valeurs ASCII : Dans ereg, si vous utilisez number dans le motif, il est supposé que vous vous référez à l'ASCII d'un caractère. Mais dans preg, le nombre n'est pas traité comme une valeur ASCII. Donc, si votre motif contient une valeur ASCII dans l'expression ereg (par exemple : nouvelle ligne, tabulations, etc), convertissez-la en hexadécimal et préfixez-la avec \x.
    Example: 9(tab) becomes \x9 or alternatively use \t.

9voto

Narayan Points 1219

À partir de la version 5.3 de PHP, ereg est déprécié.

Passer de ereg a preg_match est juste un petit changement dans notre modèle.

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');

Para eregi correspondance insensible à la casse, mettre i après le dernier délimiteur, par exemple :

eregi('pattern', 'string');

à

preg_match ('/pattern/i', 'string');

7voto

Roman Hocke Points 861

Il y a plus de différences entre ereg() y preg_replace() que la syntaxe :

  • Valeur de retour :

    • En cas d'erreur : les deux retournent FALSE
    • Sur aucune correspondance : ereg() renvoie à FALSE , preg_match() renvoie à 0
    • En match : ereg() renvoie la longueur de la chaîne ou 1 , preg_match() retourne toujours 1
  • Tableau résultant des sous-chaînes correspondantes : Si une sous-chaîne n'est pas trouvée du tout ( (b) en ...a(b)? ), l'élément correspondant dans ereg() Le résultat sera FALSE alors que dans preg_match() il ne sera pas réglé du tout.

Si quelqu'un n'est pas assez courageux pour convertir son ereg() a preg_match() il ou elle peut utiliser mb_ereg() qui est toujours disponible en PHP 7.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X