正则表达式从文本中提取URL(带/不带协议和www或子域)

时间:2014-10-21 06:03:09

标签: javascript jquery regex

我想从元素中的文本中提取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 之外,我几乎把一切都搞定了,其中它识别了电子邮件地址的域名部分。

2 个答案:

答案 0 :(得分:2)

你可以使用像

这样的正则表达式

^(http:\/\/)?(www\.)?\w+\.(com|net|org)$

参见示例

http://regex101.com/r/uQ9aL4/1

它是如何工作的?

^将正则表达式固定在线的开头。

(http:\/\/)?数学0或1出现http://

(www\.)匹配www.

的0或1次出现

\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;

完成所有这些会产生您想要的结果。其他人可能会把它放在一个正则表达式中,但我并不是那么好。