2016-08-24 73 views
1

我有一個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://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。 – Amadan

+0

@WiktorStribiżew我試過了,但它也返回給我的電子郵件地址,我不想這 – Valip

回答

1

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

相關問題