1

私はこの正規表現を書きました:<(a*)\b[^>]*>.*?</\1>

そして、この正規表現テストサイトでテストされます:http://gskinner.com/RegExr/?2tntr

正規表現のポイントは、サイトのHTMLを調べて、すべてのリンクを見つけることです。次に、これらを配列で返して、操作できるようにする必要があります。

正規表現テストサイトでは完全に機能しますが、私のサイトでJavaScriptを使用して実行すると、nullが返されます。

JavaScriptは次のようになります。

var data = $('#mainDivOnMiddleOfPage').html();

var pattern = "<(a*).*href=.*>.*</a>";
var modi = "g";

var patt = new RegExp(pattern, modi);
var result = patt.exec(data);

jQueryはページのコンテンツを取得します。これはテストおよび検証されています。

質問は、なぜこれがJavaScriptでnullを返すのに、正規表現テスターで何を返すことになっているのかということです。

4

6 に答える 6

1

すべての<a>リンク:

<a[^>]*?\bhref=['\"](.*?)['\"]

絶対リンクのみ(で始まるhttp):

<a[^>]*?\bhref=['\"](http.*?)['\"]

JavaScriptコード:

var html = '<a href="test.html">';
var m = html.match(/<a[^>]*?\bhref=['"](.*?)['"]/);
print (m[1]);

こちらのコードを参照してテストしてください。

于 2012-06-29T21:57:55.497 に答える
1

私は同じことをするために次のコードを使用します、そしてそれは私のために働きます、それを試してみてください

var data = document.getElementById('mainDivOnMiddleOfPage').textContent;

var result = data.match(/<(a*).*href=.*>.*<\/a>/);
​
于 2012-06-29T22:04:34.600 に答える
1

「正規表現のポイントは、サイトのHTMLを調べて、すべてのリンクを見つけることです。次に、これらを配列で返して、操作できるようにする必要があります。」

別の正規表現の回答は追加しませんが、(htmlだけでなく)ドキュメントを保持している場合は、リンクコレクションをたどる方が簡単であることを指摘しておきます。これには、すべて<a href="">の要素だけでなく、すべての<area>要素が含まれます。

for (var link, links = document.links, n = links.length, i=0; i<n; i++){
    link = links[i];
    switch (link.tagName){
        case "A":
            //do something with the link
            break;
        case "AREA":
            //do something with the area.
            break;
    } 
} 
于 2012-06-29T22:22:09.563 に答える
1

これはあなたが望むものだと思うので、ここに投稿してください。ただし、これは正規表現ソリューションではありません。

$(function(){
    $.ajax({
        url: "test.htm",
        success: function(data){
            var array_of_links = $.makeArray($("a",data));
            // do your stuff here
        }
    });

});
于 2012-06-29T22:23:22.617 に答える
1

答えが選ばれたことを意識しています。ただし、現在のREGEXソリューションはタグと一致しますが、実際のHREFを単独で一致させることはできません。

gこれは、JavaScriptが失敗する場所です。これは、グローバルフラグが指定されている場合、REGEXの実装がやや単純化されているため、サブグループをキャプチャできないためです。

これを回避する1つの方法は、REGEX置換コールバックを利用することです。これにより、タグではなく、リンクHREFのみが取得されます。

var html = document.body.innerHTML,
    links = [];
html.replace(/<a[^>]*?href=('|")(.*?)\1/gi, function($0, $1, $2) {
    links.push($2);
});
//links is now an array of hrefs

また、後方参照を使用してhref属性を閉じます。つまり、開始引用符と終了引用符の両方が単一または二重であり、混合されていないことを確認します。

補足:他の人が述べているように、可能であれば、正規表現ではなくこれをDOMにしたいと思うでしょう。

于 2012-06-29T22:33:16.243 に答える
0

あなたの問題はあなたがあなたの正規表現をコンパイルしていないということです:

patt.compile();

exec()メソッドで使用する前に呼び出す必要があります。

于 2012-06-29T22:30:08.000 に答える