web-dev-qa-db-fra.com

Comment convertir des expressions ereg en preg en PHP?

Depuis les expressions régulières POSIX (ereg) sont obsolètes depuis PHP 5.3.0, j'aimerais connaître un moyen simple de convertir les anciennes expressions en PCRE (expressions régulières compatibles Perl) (preg) .

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

eregi('^hello world');

Comment puis-je traduire des expressions en preg_match expressions compatibles?

Remarque: Ce message sert d'espace réservé à tous les messages liés à la conversion d'ereg en preg, ainsi que d'options de duplication pour des questions connexes. S'il vous plaît ne fermez pas cette question.

Connexes:

132
netcoder

Le changement le plus important dans la syntaxe est l'ajout de 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 ~, / 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 devez y échapper:

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

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

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

En outre, PCRE prend en charge 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 dans PHP dans le manuel , ainsi qu’un liste des différences entre POSIX regex et PCRE pour aider à convertir l'expression.

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

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

Le remplacement de Ereg par preg (à partir de PHP 5.3.0) était la bonne décision 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 pour porter les modèles ereg à preg:

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

  2. délimiteur d'échappement s'il fait partie du motif: 'patt/ern' => '/patt\/ern/'
    Atteignez-le par programme de la manière suivante:
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (correspondance insensible à la casse): 'pattern' => '/pattern/i' Donc, si vous utilisez la fonction eregi pour la correspondance insensible à la casse, ajoutez simplement 'i' à la fin du nouveau motif ('/ pattern/').

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

30
Sumoanand

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

  • Valeur de retour:

    • En cas d'erreur : les deux retournent FALSE
    • En l'absence de correspondance : ereg() renvoie FALSE, preg_match() renvoie 0
    • Lors d'une correspondance : ereg() renvoie la longueur de la chaîne ou 1, preg_match() renvoie toujours 1
  • Tableau résultant des sous-chaînes correspondantes: Si une sous-chaîne est introuvable ((b) Dans ...a(b)?), l'élément correspondant dans ereg() 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 sa ereg() en preg_match(), il peut utiliser mb_ereg () , qui est toujours disponible dans PHP 7.

7
Roman Hocke

De PHP version 5.3, ereg est obsolète.

Passer de ereg à preg_match n'est qu'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');

Pour eregi correspondance sans distinction de casse, insérez i après le dernier délimiteur, par exemple:

eregi('pattern', 'string');

à

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