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建议的那样,你需要使用反斜杠转义字符类中的“ – ”字符。