如何使用正则表达式从href属性中获取链接

问题描述:

我有一个regex表达式,它返回HTML文件中的所有链接,但它有一个问题:它不是仅返回链接,如http://link.com,它还返回href =“ (href="http://link.com)我能做些什么,只得到links不具有href="如何使用正则表达式从href属性中获取链接

这是我的正则表达式:?

/href="(http|https|ftp|ftps)\:\/\/[-a-zA-Z0-9.]+\.[a-zA-Z]{2,3}(?:\/(?:[^"<=]|=)*)?/g 

全码:

var source = (body || '').toString(); 
    var urlArray = []; 
    var url; 
    var matchArray; 

    // Regular expression to find FTP, HTTP(S) URLs. 
    var regexToken = /href="(http|https|ftp|ftps)\:\/\/[-a-zA-Z0-9.]+\.[a-zA-Z]{2,3}(?:\/(?:[^"<=]|=)*)?/g; 

    // Iterate through any URLs in the text. 
    while((matchArray = regexToken.exec(source)) !== null) 
    { 
    var token = matchArray[0]; 
    token = JSON.stringify(matchArray[0]); 
    token = matchArray[0].toString(); 
    urlArray.push([ token ]); 
    } 
+0

为什么这么复杂呢? '/ href =“([^”] +)“/ g'(如果你知道输入将总是有双引号的属性值) –

+0

你不应该用正则表达式解析HTML,使用合适的解析器。发生](http://*.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。 – Amadan

+0

@WiktorStribiżew我试过了,但它也返回给我的电子邮件地址,我不想这 – Valip

RegExp#exec将存储由您的模式中定义的捕获组捕获的所有内容。您可以通过[1]索引访问第1组。

使用

var token = matchArray[1]; 

而且,我相信你可以缩短正则表达式来只是

/\bhref="((?:http|ftp)[^"]+)"/g 

如果您确定的值总是双引号内。请参阅this demo

+0

我修改了代码,并且在您的帮助下,结果得到了改善,但仍然存在问题......现在链接已经有了'''之前(像这样:'“https:// link.com') – Valip

+0

那不是可能只需记录'matchArray [1]'值。你把它放在引号里面是因为你'JSON.stringify'它。 –

+0

你说得对,'JSON.stringify'弄乱了事情,现在一切正常! – Valip