正则表达式以获取链接文本

时间:2011-12-27 21:36:10

标签: javascript regex hyperlink

我很难过!我用谷歌搜索,阅读和阅读,我确信有一些非常愚蠢,我做错了。这是一个Greasemonkey脚本,我不能在我的生活中启动并正确执行。我想要匹配这个:

<a href="/browse/post/SOMETHING/">**SOMETHING** (1111)</a>

以下是我正在使用的内容:

var titleRegex = new RegExp("<a href=\"/browse/post/\d*/\">(.*) \(");

我确定我错过了某种逃脱角色?但我无法弄明白,以免Firefox出错。

我使用http://regexpal.com/生成正则表达式 - 在Firefox错误控制台中我收到“未终止的括号”

3 个答案:

答案 0 :(得分:4)

从字符串而不是正则表达式文字构建正则表达式时,需要加倍反斜杠。

然后,\d*仅匹配数字。我假设SOMETHING只是一个占位符,但如果它包含除数字之外的任何内容,则会失败。

此外,您应该使用(.*?)(懒惰)而不是(.*)(贪婪),或者您可能匹配太多。也许([^(]*)会更好。

很难说,在不了解更多关于你想要匹配的实际文本的情况下。

总而言之:

var titleRegex = new RegExp("<a href=\"/browse/post/\\d*/\">([^(]*) \\(");

答案 1 :(得分:2)

一般的想法是获取一串HTML,将其解析为文档(dom elements的树)然后遍历它以提取信息。

如果链接是:

<a href="/browse/post/something/"><b>something</b> else</a>

首先遍历树以找到锚标记,然后:

anchor.textContent // returns "something else"

从元素中提取文本很简单,即使下面的树中还有其他元素也包含文本。这也比正则表达式示例更强大。假设有人向锚添加了一个类属性,那么接受的答案中的正则表达式将不再与锚标记匹配。但是基于遍历的解决方案仍然有效。

在简单的情况下,您可以创建一个div,然后将innerHTML设置为您的HTML字符串,然后遍历它:

var html = '<p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a>';
var div = document.createElement("div");
div.innerHTML = html;
var anchors = div.getElementsByTagName("a");
for (var i = 0; i < anchors.length; i++) {
    console.log(anchors[i].textContent);
}

更复杂的版本打包在jQuery(string) function

var html = '<div><p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a></div>';
jQuery(html).find("a").each(function() {
    console.log(jQuery(this).text());
});

实例:http://jsfiddle.net/ygcFM/

答案 2 :(得分:1)

这是一个简单的解决方法:

/href=\".*?\">(.*?)\(/