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

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 moteursregexLes articles fournissent des connaissances théoriques,Différences entre les expressions régulières PHP et les expressions régulières JavaScriptLes 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 laCréer une bibliothèquepour 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 WebRegex Verify Email Addresset 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 PHPfilter_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 CodeIgniterForm_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
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!