2012-08-17 57 views
0

我不能發佈我試圖提取的確切數據,但這裏是一個基本的場景,具有相同的結果。我抓住了頁面的正文,並試圖從中提取一個bit.ly鏈接。舉例來說,這是我試圖從中獲取鏈接的大量數據。如何使用JavaScript從字符串獲取數據正則表達式

字符串:現在

<a href="/l.php?u=http%3A%2F%2Fbit.ly%2FPq8AkS&amp;h=aAQFZxdL0&amp;s=1" target="_blank" rel="nofollow nofollow" onmouseover="LinkshimAsyncLink.swap(this, &quot;http:\\/\\/bit.ly\\/Pq8AkS&quot;);" onclick="LinkshimAsyncLink.referrer_log(this, &quot;http:\\/\\/bit.ly\\/Pq8AkS&quot;, &quot;http:\\/\\/www.facebook.com\\/si\\/ajax\\/l\\/render_linkshim_log\\/?u=http\\u00253A\\u00252F\\u00252Fbit.ly\\u00252FPq8AkS&amp;h=aAQFZxdL0&amp;s=1&quot;);">http://bit.ly/Pq8AkS</a></div><div class="shareUnit"><div class="-cx-PRIVATE-fbTimelineExternalShareUnit__wrapper"><div><div class="-cx-PRIVATE-fbTimelineExternalShareUnit__root -cx-PRIVATE-fbTimelineExternalShareUnit__hasImage"><a class="-cx-PRIVATE-fbTimelineExternalShareUnit__video -cx-PRIVATE-fbTimelineExternalShareUnit__image -cx-PRIVATE-fbTimelineExternalShareUnit__content" ajaxify="/ajax/flash/expand_inline.php?target_div=uikk85_59&amp;share_id=271663136271285&amp;max_width=403&amp;max_height=403&amp;context=timelineSingle" rel="async" href="#" onclick="CSS.addClass(this, &quot;-cx-PRIVATE-fbTimelineExternalShareUnit__loading&quot;);CSS.removeClass(this, &quot;-cx-PRIVATE-fbTimelineExternalShareUnit__video&quot;);"><i class="-cx-PRIVATE-fbTimelineExternalShareUnit__play"></i><img class="img" src="http://external.ak.fbcdn.net/safe_image.php?d=AQDoyY7_wjAyUtX2&amp;w=155&amp;h=114&amp;url=http%3A%2F%2Fi1.ytimg.com%2Fvi%2FDre21lBu2zU%2Fmqdefault.jpg" alt="" /></a> 

,我能得到什麼,我找下面的代碼,但該鏈接並不總是要準確長6個字符。所以這導致一個問題...

Body = document.getElementsByTagName("body")[0].innerHTML; 
regex = /2Fbit.ly%2F(.{6})&amp;h/g; 
Matches = regex.exec(Body); 

這是我正在嘗試,但我的問題是,它抓住了太多的數據。它會一直到上面的字符串中的最後一個"&amp;h",而不是停在它命中的第一個。

Body = document.getElementsByTagName("body")[0].innerHTML; 
regex = /2Fbit.ly%2F(.*)&amp;h/g; 
Matches = regex.exec(Body); 

所以基本上字符串我試圖把重點放在主要的部分是"%2Fbit.ly%2FPq8AkS&amp;h"這樣我就可以得到「Pq8AkS」出來的。當我使用(.*)時,它抓住了上面大字符串中"%2F"和最後一個"&amp;h"之間的所有內容。

+1

嘗試base-64解碼URL字符串的'u'參數。 – Blender 2012-08-17 00:49:12

回答

2

你不應該在HTML上使用正則表達式。使用DOM函數獲取所需的鏈接對象,然後從中獲取href屬性,然後可以在href上使用正則表達式。

默認.*是貪婪的意義,它匹配能匹配,並從中找到一個匹配最。如果你希望它是不貪婪(匹配儘可能少的),你可以用這個來代替.*?像這樣:

regex = /2Fbit.ly%2F(.*?)&amp;h/; 

我也並不認爲你想在正則表達式的g標誌,因爲只有應在正確的URL中進行匹配。

如果你顯示你的HTML的其餘部分,我們可以在找到正確的鏈接對象,而不是試圖以配合整個身體HTML提供建議。


僅供參考,另一個伎倆非貪婪的匹配是做這樣的事情:

regex = /2Fbit.ly%2F([^&]*)&amp;h/; 

相匹配一系列字符未&之後&amp;h其實現目標,作爲同只要&不能在匹配的序列中。

+0

這對我來說非常合適。我對真正的Regex知之甚少。我查了一下,看了一下*沒有了貪婪?但真的沒有完全理解。謝謝! – RandomPrecision 2012-08-17 01:15:21

0

默認+*是儘可能貪婪和匹配。你需要一個非貪婪的匹配你的(.+)。快速search給出的解決方案爲

?直接跟隨一個量詞使得量詞非貪婪(使其與最小定義的區間的最小值相匹配)。

所以試着改變你的regex=

regex = /2Fbit.ly%2F(.*?)&amp;h/g;

編輯: @下面jfriend00的答案是更完整。

相關問題