var matches = [];
input_content.replace(/[^<]*(<a href="([^"]+)">([^<]+)<\/a>)/g, function () {
matches.push(Array.prototype.slice.call(arguments, 1, 4))
});
这假定您的锚将始终采用形式,即如果有任何其他属性(例如, )<a href="...">...</a>
,它将不起作用。target
可以改进正则表达式以适应这种情况。
分解正则表达式:
/ -> 开始正则表达式
[^<]* -> 跳过所有字符,直到第一个 <
( -> 开始捕获第一个令牌
<a href=" -> 捕获第一个锚点
( -> 开始捕获第二个令牌
[^"]+ -> 捕获所有字符直到 "
) -> 结束捕获第二个令牌
"> -> 捕获更多的锚点
( -> 开始捕获第三个令牌
[^<]+ -> 捕获所有字符,直到一个 <
) -> 结束捕获第三个标记
</a> -> 捕获锚的最后一位
) -> 结束捕获第一个令牌
/g -> 结束正则表达式,添加全局标志以匹配字符串中的所有锚点
每次调用我们的匿名函数都会收到三个标记作为第二、第三和第四个参数,即 arguments[1]、arguments[2]、arguments[3]:
- arguments[1] 是整个锚点
- arguments[2] 是 href 部分
- arguments[3] 是里面的文字
我们将使用 hack 将这三个参数作为一个新数组推送到我们的主matches
数组中。arguments
内置变量不是真正的 JavaScript 数组,因此我们必须对其应用Arraysplit
方法来提取我们想要的项目:
Array.prototype.slice.call(arguments, 1, 4)
这将从arguments
索引 1 开始到索引 4 结束(不包括在内)提取项目。
var input_content = "blah \
<a href=\"http://yahoo.com\">Yahoo</a> \
blah \
<a href=\"http://google.com\">Google</a> \
blah";
var matches = [];
input_content.replace(/[^<]*(<a href="([^"]+)">([^<]+)<\/a>)/g, function () {
matches.push(Array.prototype.slice.call(arguments, 1, 4));
});
alert(matches.join("\n"));
给出:
<a href="http://yahoo.com">雅虎</a>,http://yahoo.com,雅虎
<a href="http://google.com">谷歌</a>,http://google.com,谷歌