Puisque 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 (Perl Compatible Regular Expressions) (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: cet article sert d'espace réservé pour tous les articles liés à la conversion d'ereg en preg, et d'options de duplication pour les questions connexes. Veuillez ne pas fermer cette question.
En relation:
php
preg-replace
preg-match
pcre
ereg
netcoder
la source
la source
ereg [php]
ne donne pas beaucoup de résultats utiles. OK, je peux apporter mon soutien à celui-ci.Réponses:
Le plus gros changement dans la syntaxe est l'ajout de délimiteurs .
Les délimiteurs peuvent être à peu près tout ce qui n'est pas alphanumérique, une barre oblique inverse ou un espace blanc. Les plus utilisés sont généralement
~
,/
et#
.Vous pouvez également utiliser des crochets correspondants:
Si votre délimiteur se trouve dans l'expression régulière, vous devez l'échapper:
Vous pouvez facilement échapper à tous les délimiteurs et caractères réservés dans une chaîne en utilisant preg_quote :
En outre, PCRE prend en charge les modificateurs pour diverses choses. L'un des plus utilisés est le modificateur insensible à la casse
i
, l'alternative à eregi :Vous pouvez trouver la référence complète à la syntaxe PCRE en PHP dans le manuel , ainsi qu'une liste des différences entre POSIX regex et PCRE pour faciliter la conversion de l'expression.
Cependant, dans votre exemple simple, vous n'utiliserez pas d'expression régulière:
la source
/^\/hello/
exemple.(a(b)c)
est un PCRE parfaitement valide et délimité. Personnellement, j'aime utiliser des parenthèses()
pour me rappeler que le premier match capturé est tout.error_log
s OBTENEZ avec ces avertissements:PHP Deprecated: Function ereg() is deprecated in...
. Argh!Le remplacement de Ereg par preg (à partir de PHP 5.3.0) était une 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 vers preg:
Ajouter des délimiteurs (/):
'pattern' => '/pattern/'
Délimiteur d'échappement s'il fait partie du modèle:
'patt/ern' => '/patt\/ern/'
réalisez-le par programme de la manière suivante:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
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 /').Valeurs ASCII : Dans ereg, si vous utilisez un nombre dans le modèle, il est supposé que vous faites référence à l'ASCII d'un caractère. Mais dans preg, le nombre n'est pas traité comme une valeur ASCII. Donc, si votre modèle contient une 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.
la source
À partir de la version 5.3 de PHP,
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:
à
Pour une
eregi
correspondance insensible à la casse, mettezi
après le dernier délimiteur, par exemple:à
la source
Il y a plus de différences entre
ereg()
etpreg_replace()
que juste la syntaxe:Valeur de retour:
FALSE
ereg()
retourneFALSE
,preg_match()
retourne0
ereg()
retourne la longueur de chaîne ou1
,preg_match()
retourne toujours1
Tableau résultant de sous-chaînes correspondantes: Si une sous-chaîne n'est pas du tout trouvée (
(b)
dans...a(b)?
), l'élément correspondant dansereg()
result seraFALSE
, alorspreg_match()
qu'il ne sera pas du tout défini.Si quelqu'un n'est pas assez courageux pour le convertir
ereg()
enpreg_match()
, il ou elle peut utiliser mb_ereg () , qui est toujours disponible en PHP 7.la source