suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Konvertieren Sie den regulären JavaScript-Ausdruck in PHP

Ich weiß, dass diese Frage etwa ein Dutzend Mal gestellt wurde, aber technisch gesehen ist es kein Betrug (sehen Sie sich die anderen Fragen an, wenn Sie möchten) ;)

Grundsätzlich habe ich einen Javascript-Regex, der die E-Mail-Adresse auf Frontend-Validierung überprüft, und ich verwende CodeIgniter, um das Backend noch einmal zu überprüfen, falls die Frontend-Validierung beispielsweise nicht richtig funktioniert (Browserproblem). ) Dies ist ein ziemlich langer regulärer Ausdruck und ich weiß nicht, wo ich mit der manuellen Konvertierung beginnen soll.

Ich suche nach einem Tool zum Konvertieren von JS-Regex in PHP-Regex - Ich habe es in keiner Antwort auf ähnliche Fragen gefunden (natürlich ist es möglich, dass ein solches Tool nicht existiert.) Nun, ich habe gelogen - Einer von ihnen schlug ein Tool vor, das 39,95 $ kostet, aber ich möchte wirklich nicht so viel ausgeben, um einen einzelnen Ausdruck zu konvertieren (nein, es gibt keine kostenlose Testversion, wie aus der Antwort auf die Frage oben hervorgeht.)

Dies ist ein Javascript-Ausdruck, großzügigerweise zur Verfügung gestellt von 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

Es gibt auch die von CodeIgniter verwendete, die ich nicht verwenden möchte, da sie nicht denselben Regeln folgt (bestimmte gültige Adressen nicht zulässt):

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

Ich möchte die gleichen Regeln verwenden, die durch reguläre Javascript-Ausdrücke in PHP festgelegt werden.

Ich habe diese Inkonsistenz, bei der mein Frontend-Code sagt, dass die E-Mail-Adresse in Ordnung ist, und Codeigniter dann nein sagt, was natürlich das Verhalten ist, das ich in der App zu beheben versuche.

Danke für alle Tipps! :D

P粉465675962P粉465675962426 Tage vor904

Antworte allen(2)Ich werde antworten

  • P粉966979765

    P粉9669797652023-10-24 17:52:14

    Javascript 和 PHP 中的正则表达式引擎之间存在一些差异。请检查正则表达式引擎的比较 文章提供理论知识,PHP 正则表达式和 JavaScript 正则表达式之间的差异 答案提供实用信息。

    大多数时候,您可以在 PHP 中使用 Javascript 正则表达式模式,只需进行少量修改。作为一个根本的区别,PHP 正则表达式被定义为一个字符串(或在一个字符串中),如下所示:

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

    Javascript 正则表达式不是,它以自己的方式定义:

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

    您可以通过在 PHP 上运行正则表达式来尝试一下。建议不要在 Codeigniter 文件中替换它,您可以简单地扩展或替换本机库。您可以查看创建库以获取更多信息。

    Antwort
    0
  • P粉462328904

    P粉4623289042023-10-24 14:21:23

    我能够以比预期更好的方式解决这个问题。我无法转换我想要使用的 Javascript 正则表达式(即使在购买 RegexBuddy 之后 - 它会派上用场,但它无法产生正确的转换),所以我决定去查看 Regex 验证电子邮件地址 网站,看看他们是否有任何建议好的正则表达式。就在那时我发现了这个:

    “目前得分最高的表达式是 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

    它只匹配了 4/86 错误,而我使用的 Javascript 匹配了 8/86 错误,所以 PHP 的更准确一些。因此,我扩展了 CodeIgniter Form_validation 库,改为使用 return filter_var($str, FILTER_VALIDATE_EMAIL);

    ...但是它在 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!奇迹般有效!我不仅获得了前端和后端验证之间所寻求的一致性,而且在此过程中还获得了更准确的正则表达式。双赢!

    感谢所有提供建议的人!

    Antwort
    0
  • StornierenAntwort