18

我需要一个正则表达式来从这些 a 标签中查找 href 的内容:

<p class="bc_shirt_delete">
   <a href="/CustomContentProcess.aspx?CCID=13524&amp;OID=3936923&amp;A=Delete" onclick="javascript:return confirm('Are You sure you want to delete this item?')">delete</a>
</p>

只是网址,而不是 href/ 标签。

我在这里解析一个纯文本 ajax 请求,所以我需要一个正则表达式。

4

10 回答 10

22

你可以试试这个正则表达式:

/href="([^\'\"]+)/g

示例:http ://regexr.com?333d1

更新:或更容易通过非贪婪方法:

/href="(.*?)"/g
于 2012-12-10T14:02:12.037 回答
9

这会做得很好。http://jsfiddle.net/grantk/cvBae/216/

正则表达式示例:https ://regex101.com/r/nLXheV/1

var str = '<p href="missme" class="test"><a href="/CustomContentProcess.aspx?CCID=13524&amp;OID=3936923&amp;A=Delete" onclick="">delete</a></p>'
    
var patt = /<a[^>]*href=["']([^"']*)["']/g;
while(match=patt.exec(str)){
  alert(match[1]);
}

于 2012-12-10T14:24:45.737 回答
5

这是一个强大的解决方案:

let href_regex = /<a([^>]*?)href\s*=\s*(['"])([^\2]*?)\2\1*>/i,
    link_text = '<a href="/another-article/">another article link</a>',
    href = link_text.replace ( href_regex , '$3' );

来自 http://www.regexr.com 的彩色 href 正则表达式

它能做什么:

  • 检测到标签
  • 懒惰跳过其他 HTML 属性和组 (1) 所以你 DRY
  • 匹配href属性
  • 考虑到周围可能的空白=
  • 做一组(2),'所以"你干
  • 匹配除组 (1) 和组 (3) 之外的任何内容
  • 匹配组 (2)'"
  • 匹配组 (1)(其他属性)
  • 匹配任何其他内容,直到关闭标签
  • 设置正确的标志i忽略大小写
于 2016-11-30T11:19:37.380 回答
4

您可能不需要 Regex 来执行此操作。

o = document.getElementsByTagName('a');
urls = Array();
for (i =0; i < o.length; i++){
   urls[i] = o[i].href;
}

如果是纯文本,你可以将它插入到显示的非DOM元素中,即display: none,然后按照我描述的方式定期处理它。

于 2012-12-10T13:59:12.033 回答
3

使用 jQuery 可能更容易

 var html = '<li><h2 class="saved_shirt_name">new shirt 1</h2><button class="edit_shirt">Edit Shirt</button><button class="delete_shirt" data-eq="0" data-href="/CustomContentProcess.aspx?CCID=13524&amp;OID=3936923&amp;A=Delete">Delete Shirt</button></li><li><h2 class="saved_shirt_name">new shirt 2</h2><button class="edit_shirt">Edit Shirt</button><button class="delete_shirt" data-eq="0" data-href="/CustomContentProcess.aspx?CCID=13524&amp;OID=3936924&amp;A=Delete">Delete Shirt</button></li><li><h2 class="saved_shirt_name">new shirt 3</h2><button class="edit_shirt">Edit Shirt</button><button class="delete_shirt" data-eq="0" data-href="/CustomContentProcess.aspx?CCID=13524&amp;OID=3936925&amp;A=Delete">Delete Shirt</button></li>';
$(html).find('[data-href]');

并迭代每个节点

更新(因为帖子已更新)

让 html 成为您的原始响应

var matches = $(html).find('[href]');
var hrefs = [];
$.each(matches, function(i, el){ hrefs.push($(el).attr('href'));});
//hrefs is an array of matches
于 2012-12-10T13:57:50.390 回答
1

我结合了一些解决方案并提出了这个(在.NET中测试):

(?<=href=[\'\"])([^\'\"]+)

解释:

(?<=) :往后看,这样它就不会包含这些字符

[\'\"] : 匹配单引号和双引号

[^] : 匹配除 '^' 之后的所有字符

+ :最后一个字符出现一次或多次。

这很好用并且对报价不贪心,因为它会在找到报价的那一刻停止匹配

于 2014-03-13T23:39:41.370 回答
0
var str = "";

str += "<p class=\"bc_shirt_delete\">";
str += "<a href=\"/CustomContentProcess.aspx?CCID=13524&amp;OID=3936923&amp;A=Delete\" onclick=\"javascript:return confirm('Are You sure you want to delete this item?')\">delete</a>";
str += "</p>";

var matches = [];

str.replace(/href=("|')(.*?)("|')/g, function(a, b, match) {
  matches.push(match);
});

console.log(matches);

或者如果你不关心href:

var matches = str.match(/href=("|')(.*?)("|')/);

console.log(matches);
于 2012-12-10T14:02:01.807 回答
0

= 周围的空格怎么样?此代码将修复它:

var matches = str.match(/href( *)=( *)("|'*)(.*?)("|'*)( |>)/);
console.log(matches);
于 2015-02-20T11:46:16.030 回答
0

不贪心很重要。并迎合——匹配——' "

test = "<a href="#" class="foo bar"> banana 
        <a href='http://google.de/foo?yes=1&no=2' data-href='foobar'/>"

test.replace(/href=(?:\'.*?\'|\".*?\")/gi,'');

免责声明:它没有捕获的一件事是 html5 属性 data-href ......

于 2017-04-03T10:42:43.807 回答
0

在这种特定情况下,这可能是最快的预赛:

/f="([^"]*)/
  • 获取所有符号/字符(字母、数字、换行符等)形式f="到最近的下一个 ",不包括它,例如/is的标志是不必要的,如果为空则返回 null

但如果源包含许多其他链接,则有必要确定这正是您正在寻找的链接,在这里我们可以这样做,只需在您的预匹配中包含更多源代码,例如(当然它取决于源站点代码...)

/bc_shirt_delete">\s*<a href="([^"]*)
于 2022-02-25T10:37:25.067 回答