2014-02-13 41 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%.]* 

这只是匹配有效的编码网址中的内容,而不必担心后面会发生什么。

相关问题