Convertir une expression régulière JavaScript en PHP
P粉465675962
P粉465675962 2023-10-23 22:58:33
0
2
911

Je sais que cette question a été posée une douzaine de fois, mais techniquement ce n'est pas une arnaque (vérifiez les autres questions si vous le souhaitez) ;)

Fondamentalement, j'ai une regex Javascript pour vérifier l'adresse e-mail pour la validation frontend, et j'utilise CodeIgniter pour vérifier le backend au cas où la validation frontend ne fonctionnerait pas correctement (problème de navigateur) par exemple. ) Il s'agit d'une expression régulière assez longue et je ne sais pas par où commencer pour la convertir manuellement.

Je recherche un outil pour convertir une regex JS en regex PHP - Je ne l'ai trouvé dans aucune réponse à des questions similaires (bien sûr, il est possible qu'un tel outil n'existe pas.) Eh bien, j'ai menti - l'un d'eux a suggéré un outil qui coûte 39,95 $, mais je ne veux vraiment pas dépenser autant pour convertir une seule expression (non, il n'y a pas d'essai gratuit, comme le suggère la réponse à la question ci-dessus.)

Il s'agit d'une expression Javascript, généreusement fournie par aSeptik :

/^((([a-z]|d|[!#$%&'*+-/=?^_`{|}~]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])+(.([a-z]|d|[!#$%&'*+-/=?^_`{|}~]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])+)*)|((x22)((((x20|x09)*(x0dx0a))?(x20|x09)+)?(([x01-x08x0bx0cx0e-x1fx7f]|x21|[x23-x5b]|[x5d-x7e]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(\([x01-x09x0bx0cx0d-x7f]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))))*(((x20|x09)*(x0dx0a))?(x20|x09)+)?(x22)))@((([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).)+(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).?$/i

Il y a aussi celui utilisé par CodeIgniter, que je ne souhaite pas utiliser car il ne suit pas les mêmes règles (n'autorise pas certaines adresses valides) :

/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)*@([a-z0-9-]+.)+[a-z]{2,6}$/ix

Je souhaite utiliser les mêmes règles définies par les expressions régulières Javascript en PHP.

J'ai cette incohérence où mon code frontal indique que l'adresse e-mail est OK, puis Codeigniter dit non, ce qui est bien sûr le comportement que j'essaie de corriger dans l'application.

Merci pour tous les conseils ! :D

P粉465675962
P粉465675962

répondre à tous(2)
P粉966979765

Il existe quelques différences entre les moteurs d'expressions régulières en Javascript et PHP. Veuillez vérifier la comparaison des moteurs regex Les articles fournissent des connaissances théoriques, Différences entre les expressions régulières PHP et les expressions régulières JavaScript Les réponses fournissent des informations pratiques.

La plupart du temps, vous pouvez utiliser des modèles d'expressions régulières Javascript en PHP avec seulement des modifications mineures. Comme différence fondamentale, les expressions régulières PHP sont définies comme une chaîne (ou dans une chaîne) comme ceci :

preg_match('/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/',$telephone);

Les expressions régulières Javascript ne le sont pas, elles sont définies à sa manière :

var ptr = new RegExp(/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/);
// or
var ptr = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;

Vous pouvez l'essayer en exécutant des expressions régulières sur PHP. Il est recommandé de ne pas le remplacer dans les fichiers Codeigniter, vous pouvez simplement étendre ou remplacer la bibliothèque native. Vous pouvez consulter la Créer une bibliothèque pour plus d'informations.

P粉462328904

J'ai pu résoudre ce problème d'une meilleure manière que prévu. Je ne pouvais pas convertir l'expression régulière Javascript que je voulais utiliser (même après avoir acheté RegexBuddy - cela serait utile, mais cela ne produirait pas la conversion correcte), j'ai donc décidé de consulter le site Web Regex Verify Email Address et voir ce qu'ils ont. Y a-t-il une suggestion pour une bonne expression régulière. C'est alors que j'ai découvert ceci :

"L'expression la plus performante est de loin celle utilisée par les PHP filter_var()":

/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD

Il ne correspondait qu'à 4/86 erreurs, tandis que le Javascript que j'ai utilisé correspondait à 8/86 erreurs, donc celui de PHP est plus précis. J'ai donc étendu CodeIgniter Form_validation 库,改为使用 return filter_var($str, FILTER_VALIDATE_EMAIL);.

...mais est-ce que ça marche en Javascript ?

var pattern = new RegExp(/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/i);

Zing! Fonctionne miraculeusement ! Non seulement j’ai obtenu la cohérence que je recherchais entre la validation front-end et back-end, mais j’ai également obtenu des expressions régulières plus précises au cours du processus. Gagnant-gagnant !

Merci à tous ceux qui ont fourni des suggestions !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal