如何使用Javascript Regex从字符串中获取数据

时间:2012-08-17 00:47:24

标签: javascript regex wildcard scrape

我无法发布我想要提取的确切数据,但这是一个具有相同结果的基本方案。我抓住了一个页面的主体,试图从中提取一个bit.ly链接。例如,让我们说,这是我试图从中获取链接的数据块。

字符串:

<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 个答案:

答案 0 :(得分:0)

默认情况下+*是贪婪的并且尽可能匹配。您需要为(.+)进行非贪婪的匹配。快速search为解决方案提供了

  

?直接跟随量词使量词非贪婪(使其与最小值匹配,而不是定义的最大值)。

因此,请尝试将regex=行更改为

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

编辑: @jfriend00的答案更完整。