簡體   English   中英

Javascript RegExp返回不需要的字符

[英]Javascript RegExp returning unwanted characters

我有這個字符串:

<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 URL。 所以我正在使用這個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它看起來完美無缺。

先感謝您。

在regex101中,我相信你正在考慮被捕獲的群體,但這並不是所有的正則表達式返回: 匹配本身將是整個正則表達式所匹配的,而不僅僅是括號內的內容。

這基本上意味着您必須解決問題:

  • 返回第一個捕獲的組 您的正則表達式可以正常工作,您只需返回正確的捕獲值即可。 (BTW,無需逃避]] 。您可以使用(http%3A.*?)(?:\\?|]])對其進行分解, (?: ) :)是非捕獲組)

  • 編輯你的正則表達式,以便結束分隔符不是匹配的一部分 看起來像前面的東西可以工作,比如http%3A.*?(?=\\?|]]) (注意不再需要括號),但你可以用以下方法實現同樣的目的:

     http%3A[^]?]* 

    [^ ]意思是“括號內的東西”。

有很多解決方案,但這是我更喜歡的:

http%3A[\w%.]*

這只是匹配有效編碼URL中的內容,而不用擔心之后會發生什么。

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

應該做的工作

編輯:小解釋:

(?=regex)

...測試正則表達式而不將結果添加到匹配項中。 它被稱為“積極前瞻”。

我不確定你是如何使用你的RegExp的,但這應該有效:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM