JavaScript正则表达式匹配文本字段中的URL

如何设置我的正则表达式进行测试,以查看URL是否包含在javascript中的文本块中。 我无法弄清楚用于实现这一目标的模式

var urlpattern = new RegExp( "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?" var txtfield = $('#msg').val() /*this is a textarea*/ if ( urlpattern.test(txtfield) ){ //do something about it } 

编辑:

所以我现在使用的模式在正则表达式测试器中用于我需要它做什么,但是chrome会抛出错误

  "Invalid regular expression: /(http|ftp|https)://[w-_]+(.[w-_]+)+([w-.,@?^=%&:/~+#]*[w-@?^=%&/~+#])?/: Range out of order in character class" 

对于以下代码:

 var urlexp = new RegExp( '(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?' ); 

虽然转义破折号字符(在字符类中可以具有特殊含义作为字符范围说明符) 应该可以工作,但是另外一种方法可以将它们放在类定义的开头或结尾处。

另外,字符类中的\+\@确实被JavaScript引擎分别解释为+@ ; 然而,逃避不是必要的,可能会使试图在视觉上解释正则表达的人感到困惑。

为了您的目的,我会推荐以下正则表达式:

 (http|ftp|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])? 

这可以通过将其传递给RegExp构造函数(在您的示例中执行)在JavaScript中指定:

 var urlPattern = new RegExp("(http|ftp|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?") 

或者使用//引用方法直接指定正则表达式文字:

 var urlPattern = /(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/ 

如果您将正则表达式作为字符串(例如,来自用户输入或AJAX调用)接受,则RegExp构造函数是必需的,并且可能更具可读性(在本例中)。 我相当肯定//引用方法更有效,并且在某些时候更具可读性。 两者都有效。

我使用Chrome在< JSFiddle >和< RegexLib.com >上使用客户端正则表达式引擎(浏览器)并专门选择JavaScript来测试您的原始和此修改。 虽然第一个失败了你说的错误,我的建议修改成功。 如果我从源中的http中删除h ,它将无法匹配,因为它应该!

编辑

正如@noa在评论中所指出的,上面的表达式将不匹配本地网络(非互联网)服务器或使用单个单词访问的任何其他服务器(例如http://localhost/ …或https://sharepoint-test-server/ …)。 如果需要匹配这种类型的URL(它可能是也可能不是),以下可能更合适:

 (http|ftp|https)://[\w-]+(\.[\w-]+)*([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])? #------changed----here-------------^ 

< 结束编辑 >

最后,一个很好的资源告诉我90%关于正则表达式的知识是Regular-Expressions.info – 我强烈推荐它,如果你想学习正则表达式(它可以做什么,不能做什么)!

使用new RegExp时必须转义反斜杠。

你也可以把破折号放在字符类的末尾以避免转义它。

& 在字符类中表示& or a or m or p or ; ,你只需要把&;a, m and p已经由\w匹配。

所以,你的正则表达式成为:

 var urlexp = new RegExp( '(http|ftp|https)://[\\w-]+(\\.[\\w-]+)+([\\w-.,@?^=%&:/~+#-]*[\\w@?^=%&;/~+#-])?' ); 

这是最完整的单一URL解析模式。

它适用于任何子字符串中的任何URI / URL!

https://regex101.com/r/jO8bC4/5

示例带有输出的JS代码 – 每个URL都被转换为其“部分”的5部分数组:

 var re = /([az]+\:\/+)([^\/\s]*)([a-z0-9\-@\^=%&;\/~\+]*)[\?]?([^ \#]*)#?([^ \#]*)/ig; var str = 'Bob: Hey there, have you checked https://www.facebook.com ?\n(ignore) https://github.com/justsml?tab=activity#top (ignore this too)'; var m; while ((m = re.exec(str)) !== null) { if (m.index === re.lastIndex) { re.lastIndex++; } console.log(m); } 

会给你以下几点:

 ["https://www.facebook.com", "https://", "www.facebook.com", "", "", "" ] ["https://github.com/justsml?tab=activity#top", "https://", "github.com", "/justsml", "tab=activity", "top" ] 

BAM! RegEx FTW!

试试(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?

我已经清理了你的正则表达式:

 var urlexp = new RegExp('(http|ftp|https)://[a-z0-9\-_]+(\.[a-z0-9\-_]+)+([a-z0-9\-\.,@\?^=%&;:/~\+#]*[a-z0-9\-@\?^=%&;/~\+#])?', 'i'); 

经过测试,效果很好;)

尝试使用此常规正则表达式的许多URL格式

 /(([A-Za-z]{3,9})://)?([-;:&=\+\$,\w]+@{1})?(([-A-Za-z0-9]+\.)+[A-Za-z]{2,3})(:\d+)?((/[-\+~%/\.\w]+)?/?([&?][-\+=&;%@\.\w]+)?(#[\w]+)?)?/g 

试试这对我有用

 /^((ftp|http[s]?):\/\/)?(www\.)([a-z0-9]+)\.[az]{2,5}(\.[az]{2})?$/ 

这是如此简单易懂

麻烦的是字符类(括号)中的“ – ”被解析为范围:[az]表示“a和z之间的任何字符”。 正如Vini-T建议的那样,你需要使用反斜杠转义字符类中的“ – ”字符。