搜索

首页  >  问答  >  正文

转换JavaScript正则表达式为PHP

我知道这个问题已经被问了大约十几次,但从技术上讲,这个问题并不是一个骗局(如果您愿意,请检查其他问题);)

基本上,我有一个 Javascript 正则表达式来检查用于前端验证的电子邮件地址,并且我使用 CodeIgniter 在后端进行双重检查,以防前端验证无法正常运行(浏览器问题)例如。)这是一个相当长的正则表达式,我不知道从哪里开始手动转换它。

我正在寻找一种将 JS 正则表达式转换为 PHP 正则表达式的工具 - 我还没有在类似问题的任何答案中找到它(当然,有可能这样一个工具不存在。)好吧,我撒谎了 - 其中一个建议了一个花费 39.95 美元的工具,但我真的不想花那么多钱来转换单个表达式(不,没有免费试用版,因为由上述问题的答案建议。)

这是 Javascript 表达式,由 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

还有 CodeIgniter 使用的那个,我不想使用它,因为它不遵循相同的规则(不允许某些有效地址):

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

我想使用 PHP 中的 Javascript 正则表达式设置的相同规则

出现这种不一致的情况,我的前端代码说电子邮件地址没问题,然后 Codeigniter 说不行,这当然是我试图在应用程序中修复的行为。

感谢您提供的所有提示! :D

P粉465675962P粉465675962426 天前903

全部回复(2)我来回复

  • 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 文件中替换它,您可以简单地扩展或替换本机库。您可以查看创建库以获取更多信息。

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

    感谢所有提供建议的人!

    回复
    0
  • 取消回复