我想从元素中的文本中提取URL。我对regexp不是很了解,但这是我到目前为止所做的:
var regexp = /((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/i;
请检查这个小提琴,看看我的正则表达式是如何工作的:http://jsfiddle.net/h70mr1zt/5/
这是我需要的结果:
1. stackoverflow => not found
2. stackoverflow.com => found => stackoverflow.com
3. www.stackoverflow.com => found => www.stackoverflow.com
4. api.stackoverflow.com => found => api.stackoverflow.com
5. http://www.stackoverflow.com => found => http://www.stackoverflow.com
6. foo://www.stackoverflow.com => found => www.stackoverflow.com
7. someone@stackoverflow.com => not found
8. .com => not found
正如你可以看到我的小提琴,除了数字 7 之外,我几乎把一切都搞定了,其中它识别了电子邮件地址的域名部分。
答案 0 :(得分:2)
你可以使用像
这样的正则表达式 ^(http:\/\/)?(www\.)?\w+\.(com|net|org)$
参见示例
http://regex101.com/r/uQ9aL4/1
它是如何工作的?
^
将正则表达式固定在线的开头。
(http:\/\/)?
数学0或1出现http://
(www\.)
匹配www.
\w*
计算任意数量的alphanum
.(com|net|org)$
匹配.com
或.net
或.org
$
将正则表达式锚定在字符串的末尾。
答案 1 :(得分:1)
您可以使用此正则表达式执行此操作:
/^(?:[a-z]*?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/i
请参阅jsfiddle
修改强>
很难匹配任何(甚至是虚构的)协议,并且还排除了域名,例如不使用断言的电子邮件(Lookahead&& lookbehind,javascript不支持)。
我会选择类似this的东西:
$('li').each(function(){
var text = $(this).text(),
regexp = /(^https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/i;
regexpMail = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i;
if((url = regexp.exec(text)) && !text.match(regexpMail)){
$(this).append(' => <b>found</b> => <span>'+url[0]+'</span>');
}else{
$(this).append(' => <b class="nf">not found</b>');
}
});
分解:
Matches http/s matches the rest
v v
regexp = /(^https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/i;
由于上述电子邮件将提取电子邮件的域名部分,您还需要进行严格的检查以排除电子邮件,女巫在此正则表达式中完成:
regexpMail = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i;
完成所有这些会产生您想要的结果。其他人可能会把它放在一个正则表达式中,但我并不是那么好。