Regex从文本中提取URL(有/没有协议和www或子域)

Regex to extract URL from text (with/without protocol and www or subdomains)

本文关键字:协议 www 文本 提取 URL Regex      更新时间:2023-09-26

我想从元素内的文本中提取URL。我不太擅长regexp,但这是我迄今为止所做的:

var regexp = /((https?:'/'/)?['w-]+('.['w-]+)+'.?(:'d+)?('/'S*)?)/i;

请检查这个fiddle,看看我的regexp是如何工作的: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,它识别电子邮件地址的域部分。

您可以使用类似的正则表达式

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

参见示例

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

它是如何工作的?

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

(http:'/'/)?模拟http:// 0或1次出现

(www'.)匹配0或1次www.

'w*计算任意数量的字母数

.(com|net|org)$匹配.com.net.org

$将正则表达式锚定在字符串的末尾。

您可以使用以下regexp:

/^(?:[a-z]*?:'/'/)?(['da-z'.-]+)'.([a-z'.]{2,6})(['/'w '.-]*)*'/?$/i

参见jsfiddle

编辑

在不使用断言的情况下,很难匹配ANY(甚至是虚构的)协议,也很难从电子邮件中排除域名(Lookahead&&lookbacking,javascript不支持)。

我会选择这样的东西:

$('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;

由于上述电子邮件将提取电子邮件的域名部分,您也需要进行安全检查以排除电子邮件,因此在以下regexp:中进行了切换

 regexpMail = /'b[A-Z0-9._%+-]+@[A-Z0-9.-]+'.[A-Z]{2,4}'b/i;

做所有这些都会得到你想要的结果。其他人可能会把它放在一个正则表达式中,但我不是那么好。