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

“正则表达式的重点是通过网站 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

继续在此处发布此内容,因为我认为这是您想要的 - 但是,它不是 RegEx 解决方案。

$(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

我使用下面的代码来做同样的事情,它对我有用,试试看

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

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

我有意识地选择了一个答案。然而,值得一提的是,当前的 REGEX 解决方案匹配标签,而不是孤立的实际 HREF。

这就是 JavaScript 失败的地方,因为它有点简单的 REGEX 实现不允许在g指定全局标志时捕获子组。

解决此问题的一种方法是利用 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,而不是 REGEX。

于 2012-06-29T22:33:16.243 回答
0

你的问题是你没有编译你的正则表达式:

patt.compile();

您必须在使用该exec()方法之前调用它。

于 2012-06-29T22:30:08.000 回答