0

抽出しようとしている正確なデータを投稿することはできませんが、同じ結果になる基本的なシナリオを次に示します。ページの本文を取得して、そこから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"

4

2 に答える 2

2

HTMLで正規表現を使用しないでください。DOM関数を使用して目的のリンクオブジェクトを取得し、そこからhref属性を取得すると、hrefだけで正規表現を使用できます。

デフォルト.*では貪欲です。つまり、一致する可能性が最も高く、一致するものを見つけることができます。欲張りでない(可能な限り一致しない)ようにしたい場合は、.*?代わりに次のように使用できます。

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

gまた、正しいURLに一致するものは1つだけであるため、正規表現にフラグを付ける必要はないと思います。

HTMLの残りの部分を表示する場合は、本文のHTML全体を一致させるのではなく、適切なリンクオブジェクトを見つけるためのアドバイスを提供できます。


参考までに、欲張りでない試合のもう1つのトリックは、次のようなことを行うことです。

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

これは、一致するシーケンスに含まれない限り、同じ目標を達成する&後続の文字のシリーズと一致します。&amp;h&

于 2012-08-17T01:01:00.863 に答える
0

デフォルト+*は、貪欲であり、可能な限り一致します。の欲張りでない一致が必要です(.+)。クイック検索は、次のような解決策を提供します

?数量詞の直後に続くと、数量詞は欲張りになりません(定義された間隔の最大値ではなく最小値に一致します)。

だからあなたのregex=ラインをに変更してみてください

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

編集:以下の@jfriend00の答えはより完全です。

于 2012-08-17T00:59:57.293 に答える