JavaScript与php中的正则表达式是不是一样的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript与php中的正则表达式是不是一样的?相关的知识,希望对你有一定的参考价值。
javascript中的正则表达式跟php或者其他编程语言里面的正则表达式是否一样的?有区别吗?
参考技术A 一样的,正则表达式不是某个语言的语法,而是一中独立的匹配机制 参考技术B 是一样的 独立出来的一种技术将 Javascript 正则表达式转换为 PHP
【中文标题】将 Javascript 正则表达式转换为 PHP【英文标题】:Converting Javascript Regex to PHP 【发布时间】:2012-08-12 01:18:27 【问题描述】:我知道这个问题已经被问了十几次了,但从技术上讲,这个问题并不是一个骗子(如果你愿意,请检查其他问题);)
基本上,我有一个 Javascript 正则表达式来检查我用于前端验证的电子邮件地址,并且我使用 CodeIgniter 对后端进行双重检查,以防前端的验证无法正常运行(浏览器问题,例如。)这是一个很长的正则表达式,我不知道从哪里开始手动转换它。
我正在寻找一种将 JS 正则表达式转换为 PHP 正则表达式的工具 - 我在类似问题的任何答案中都没有找到一个(当然,这样的工具不存在。)好吧,我撒了谎 - one of them 建议了一个成本为 39.95 美元的工具,但我真的不想花那么多钱来转换单个表达式(不,没有免费试用版,因为由上述问题的答案所建议。)
这是 Javascript 表达式,graciously provided by aSeptik:
/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`\|~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`\|~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i
还有 CodeIgniter 使用的那个,我不想使用它,因为它不遵循相同的规则(不允许某些有效地址):
/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]2,6$/ix
我想在 PHP 中使用 Javascript 正则表达式设置的相同规则。
在我的前端代码说电子邮件地址正常,然后 Codeigniter 说不是,这种不一致当然是我试图在我的应用程序中修复的行为。
感谢您提供的所有提示! :D
【问题讨论】:
@LarryBattle 可能是,但是使用它的 CodeIgniter 文件是.php
文件,整行是这样的:return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]2,6$/ix", $address)) ? FALSE : TRUE;
试试这个解决方案。 ***.com/questions/2514810/…
有一个工具可以做到这一点:RegexBuddy 可以将正则表达式从/到几乎任何相关的风格。
@TimPietzcker 对,但正如问题中所提到的,RegexBuddy 的成本为 40 美元,我很难证明花费这笔钱来转换一个正则表达式......
【参考方案1】:
现在有一个网站https://regex101.com/,您可以在其中将一个 JS 正则表达式转换为 PHP 或其他一些语言。
【讨论】:
【参考方案2】:Javascript 和 PHP 中的正则表达式引擎之间存在一些差异。请查看Comparison of regular-expression engines 文章以获取理论知识和Difference between PHP regex and JavaScript regex 答案以获取实用信息。
大多数时候,您只需稍作修改即可在 PHP 中使用 Javascript 正则表达式模式。作为一个根本区别,PHP 正则表达式被定义为一个字符串(或在一个字符串中),如下所示:
preg_match('/^\(?(\d3)\)?[- ]?(\d3)[- ]?(\d4)$/',$telephone);
Javascript 正则表达式不是,它以自己的方式定义:
var ptr = new RegExp(/^\(?(\d3)\)?[- ]?(\d3)[- ]?(\d4)$/);
// or
var ptr = /^\(?(\d3)\)?[- ]?(\d3)[- ]?(\d4)$/;
您可以通过在 PHP 上运行正则表达式来尝试一下。作为建议,不要在 Codeigniter 文件中替换它,您可以简单地扩展或替换本机库。您可以查看Creating Libraries 了解更多信息。
【讨论】:
谢谢,但是在将 JS 正则表达式放入preg_match
: Message: preg_match() [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \Nname, \U, or \u at offset 44
时出现此错误
所以有时可能需要修改 :) 看看这个话题***.com/questions/3538293/…【参考方案3】:
我能够以比预期更好的方式解决这个问题。我无法转换我想使用的 Javascript 正则表达式(即使在购买了 RegexBuddy 之后——它会派上用场,但它无法产生正确的转换),所以我决定去查看 Regex Validate Email Address 网站看看他们是否对好的正则表达式有任何建议。就在那时我发现了这个:
“目前得分最高的表达式是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);
赞!奇迹般有效!我不仅得到了我在前端和后端验证之间寻找的一致性,而且在这个过程中我也得到了一个更准确的正则表达式。双赢!
感谢所有提供建议的人!
【讨论】:
“它无法产生正确的转换”是什么意思?您是否使用命令Paste from a JavaScript // Operator
导入它并在使用选项卡上选择PHP (preg)
并选择If/else branch whether the regex matches (part of) a string
选项?
@TimPietzcker 也许我做的不对——我把它粘贴在顶部并使用下拉列表JavaScript
,然后在底部选择Use
选项卡,最后选择语言@ 987654332@ 和If/else branch whether the regex matches (part of) a string
。也许我应该使用Paste from JavaScript // Operator
。结果,当我把它放在 PHP 中时,没有抛出任何错误,但没有任何匹配;一切都回来了。以上是关于JavaScript与php中的正则表达式是不是一样的?的主要内容,如果未能解决你的问题,请参考以下文章