Javascript RegExp返回不需要的字符

时间:2014-02-13 12:25:54

标签: javascript regex

我有这个字符串:

<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>

我想从这里提取所有ENCODED网址。 所以我正在使用这个RegExp:

(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]] 

这很好,但我不想要最后的“]]和”?“ 如何获取没有这些结束字符的URL?

这很奇怪,因为在这里尝试我的正则表达式http://regex101.com/r/zS0tZ8它看起来完美无缺。

提前谢谢。

4 个答案:

答案 0 :(得分:2)

在regex101中我相信你正在考虑被捕获的组,但这不是所有的正则表达式返回:匹配本身将与整个正则表达式相匹配,不仅如此什么是括号内。

这基本上意味着您必须解决问题:

  • 返回第一个捕获的群组。您的正则表达式可以正常工作,您只需返回正确的捕获值即可。 (顺便说一句,无需转义]]。您可以使用(http%3A.*?)(?:\?|]])对其进行分解,(?: )为非捕获组

  • 修改您的正则表达式,以便结束分隔符不属于匹配。看起来像是http%3A.*?(?=\?|]])可以起作用(注意不再需要括号),但你可以用以下方法实现同样的目的:

    http%3A[^]?]*
    

    [^ ]表示“除了括号内的内容之外的任何内容”。

答案 1 :(得分:1)

有很多解决方案,但我更喜欢这个:

http%3A[\w%.]*

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

答案 2 :(得分:0)

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

应该做的工作

编辑:小解释:

(?=regex)

...测试正则表达式而不将结果添加到匹配项中。它被称为“积极前瞻”。

答案 3 :(得分:0)

我不确定您是如何使用RegExp的,但这应该有效:

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

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