2014-06-17 32 views
0

我使用正則表達式找到一個谷歌日曆XML飼料環節,其形式顯示出來:如何使用正則表達式的多個返回值?

<a href="http://www.drsketchysdublin.com/event-registration/?ee=11">http://www.drsketchysdublin.com/event-registration/?ee=11</a> 

,我想用

<a href="http://www.drsketchysdublin.com/event-registration/?ee=11">drsketchysdublin</a> 

我使用替換此以下正則表達式匹配的文本:

expression = //(<a\shref="https?[^>]+>(https?:\/\/www\.([^\.]+)\.com[^<]+)<\/a>)/ig; 

,然後做一個替代使用

return element.html(element.text().replace(expression, "<a href='$1' target='"+options.target+"'>$2</a>")); 

,我想$ 1是

(https?:\/\/www\.([^\.]+)\.com[^<]+)<\/a>) 

和$ 2的值是我使用的代碼從這裏http://gabrielizaias.com/articles/jquery-urltolink-plugin/

我如何可以參考的

([^\.]+) 

值兩個從正則表達式返回的值?我嘗試過表達式[0],但沒有運氣。

+0

首先,你確定你的正則表達式匹配正確嗎? (也注意到許多回應會批評你使用正則表達式來瀏覽HTML,因爲這是JQuery的選擇器的完美之處) – Katana314

+0

很確定 - 我一直在使用[Rad Softare Regex Designer](http:// rad-software-regular -expression-designer.software.informer.com/1.4/)來測試它。 至於你的第二點,你可能是正確的,但因爲我必須在某個時候使用正則表達式來提取域名,我想我可能會使用它的整個事情。 – looeee

回答

0

您可以使用函數作爲第二個參數來替換。該函數允許來自表達式的參數。參數是(完全匹配,[捕獲項目,]匹配偏移量,原始字符串)。您可以在此功能中擁有多個捕捉項目。一個簡單的例子:

var testItem = '[email protected]'; 
var expression = new RegExp(/^([^@]+)@([^@]+)$/) 
var returnItem = testItem.replace(expression, function(full_match, $1, $2, offset, original){ 
    console.log('full match: '+full_match) 
    console.log('$1: '+$1) 
    console.log('$2: '+$2) 
    console.log('offet: '+offset) 
    console.log('original: '+original) 
    return (typeof $1 != "undefined" && typeof $2 != "undefined") ? $1+','+$2 : false; 
}); 
if (returnItem !== false) console.log(returnItem.split(',')) 
else console.log('bad return value'); 

的片段聲明瞭一個簡單的字符串,劫掠@符號兩側的項目的表達式,然後使用一個替代函數返回兩個匹配的項目,他們已經被解析之後。控制檯登錄返回函數是爲了演示每個變量持有的內容。運行上面的代碼後,我收到了以下的輸出:

full match: [email protected] 
$1: test1 
$2: test2 
offet: 0 
original: [email protected] 
["test1", "test2"] 

您可以用它來解析從正則表達式用小修改的回報。 我的示例代碼有一個問題:我的返回使用逗號分割來創建數組。如果您的內容可能有逗號,則無法使用。

這是不是對你的問題,你可以使用類似以下內容:

var temp = '<a href="http://www.drsketchysdublin.com/event-registration/?ee=11">http://www.drsketchysdublin.com/event-registration/?ee=11</a>' 
var expression = /<a\shref="https?[^>]+>(https?:\/\/www\.([^\.]+)\.com[^<]+)<\/a>/ig; 
var options = {target : 'blank'} 

console.log(temp.replace(expression, function(full_match, $1, $2, offset, original){ return '<a href="'+$1+'" target="'+options.target+'">'+$2+'</a>';})) 

只是改變變量位(和更改控制檯登錄到理所當然的回報),你應該沒事的。 請注意,我從你的正則表達式中刪除了一組括號,他們似乎沒有用於任何事情,所以我放棄了它們。如果你有任何關於使正則表達式更普遍的問題讓我知道。

+0

非常感謝您提供這個廣泛的答案 - 這正是我一直在尋找的! – looeee