2014-02-13 73 views
1

我有這個字符串:的Javascript正則表達式返回不需要的字符

<AdParameters> 
    <VpaidClickThrough><![CDATA[http://media.adrcdn.com/ads/exit.html]]></VpaidClickThrough> 
    <VpaidClickTracking><![CDATA[]]></VpaidClickTracking> 
    <VpaidPath><![CDATA[http%3A%2F%2Fmedia.adrcdn.com%2Fads%2FAdrime%2F3130343734%2F61112%2F]]></VpaidPath> 
    <VpaidDuration><![CDATA[]]></VpaidDuration> 
    <VpaidId><![CDATA[e322f52bc813f05beacb6fe522a52f20]]></VpaidId> 
</AdParameters> 
<MediaFiles> 
    <MediaFile id="0" maintainAspectRatio="false" scalable="false" delivery="progressive" width="640" height="360" apiFramework='VPAID' type="application/x-shockwave-flash"> <![CDATA[http%3A%2F%2Fmedia.adrcdn.com%2Fads%2FAdrime%2F3130343734%2F61112%2Fmediafile_lineair_640x360.swf?VpaidId=e322f52bc813f05beacb6fe522a52f20&VpaidPath=http%3A%2F%2Fmedia.adrcdn.com%2Fads%2FAdrime%2F3130343734%2F61112%2F]]></MediaFile> 
<MediaFiles> 

而且我想從這裏所有的編碼的URL中提取。 所以我用這個正則表達式:

(http\%3A.*)\?|(http\%3A.*)\]\] 

但我得到的是這樣的:「?」

http%3A%2F%2Fmedia.adrcdn.com%2Fads%2FAdrime%2F3130343734%2F61112%2F]] 
http%3A%2F%2Fmedia.adrcdn.com%2Fads%2FAdrime%2F3130343734%2F61112%2Fmediafile_lineair_640x360.swf? 
http%3A%2F%2Fmedia.adrcdn.com%2Fads%2FAdrime%2F3130343734%2F61112%2F]] 

這是相當好,但我不希望最後的「]」和 如何獲取沒有這些結尾字符的網址?

這很奇怪,因爲在這裏嘗試我的正則表達式http://regex101.com/r/zS0tZ8它看起來很完美。

預先感謝您。

+2

爲什麼你把\\] \\]在你的正則表達式呢? – Onheiron

+0

您誤解了該頁面上的匹配項。數學小組下面的部分列出了正確的正則表達式部分,即括號中的部分。如果你看看實際的字符串,你會發現它們實際上是匹配額外的字符。 –

回答

2

在regex101我相信你正在考慮的捕獲組,但是這還不是全部的正則表達式返回:比賽本身將是什麼由整個正則表達式匹配,不僅裏面有什麼括號。

這基本上意味着你必須解決您的問題的方法:

  • 回報捕獲的第一組。你的正則表達式可以完成這個工作,你只需要返回正確的捕獲值。 (順便說一句,沒必要逃避]]。你可以用(http%3A.*?)(?:\?|]])因式分解吧,(?:)是一個非捕獲組)

  • 編輯您的正則表達式,從而結束分隔符不匹配的一部分。用看起來是未來可能的工作,像http%3A.*?(?=\?|]])(注意有沒有需要括號了),但你也許可以實現同樣的事情:

    http%3A[^]?]* 
    

    [^ ]意爲「什麼,但括號裏面是什麼。」

+1

無需在這裏轉義'%'! ;) –

+0

@KendallFrey:woop你是對的,我只是把它複製到。:/謝謝! – Robin

+0

我在這裏http://www.regextester.com/嘗試了所有的建議,唯一一個返回我想要的是預測的。非常感謝你!!! –

0
http%3A.*?(?=\?|]]) 

應該做的工作

編輯:一點解釋:

(?=regex) 

...測試正則表達式,而不把結果加入了比賽。這就是所謂的「積極向前看」。

+0

不需要'']''在這裏! – Robin

+0

@Robin oops,ty,編輯:) – Nyx

0

我不知道你怎麼用你的正則表達式,但這應該工作:

function extractEncodedURLs(str) { 
    var pattern = /(http%3A.*?)(\?|]])/g; 

    var results = []; 
    var match; 
    while (match = pattern.exec(str)) { 
    results.push(match[1]); 
    } 
    return results; 
} 
+0

僅供參考,不需要轉義']]',也不需要'%'! – Robin

+0

啊,謝謝!我只是重複使用給定的模式:) –

+0

刪除逃生。 –

1

有許多這種解決方案,但是這是我喜歡:

http%3A[\w%.]* 

這只是匹配有效的編碼網址中的內容,而不必擔心後面會發生什麼。

相關問題