提取包含特定单词的超链接的正则表达式

6
我需要从一段文本中提取包含特定单词的超链接。例如:
“这是一段带有指向某个页面的链接的文本。单击此链接这是没有在url中包含单词“specificword”的链接
所以,我需要解析这段文本,检查超链接是否包含单词“specificword”,然后提取整个超链接。然后我将得到以下结果:
<a href="/server/specificword.htm>this is a link to a page</a>

我需要一个超链接,它在url中具有特定的单词,例如/server/specificword.htm,而不是在链接文本中。
我尝试过的一个正则表达式是:/(<a[^>]*>.*?</a>)|specificword/。这将匹配文本中的所有超链接或"specificword"。如果文本中有多个链接,但没有单词"specificword",我也会得到那些链接。
此外,我也尝试了这个正则表达式,但它什么也没有匹配到:
<a.*?href\s*=\s*["\']([^"\'>]*specificword[^"\'>]*)["\'][^>]*>.*?<\/a>

我的正则表达式技能到此为止了,任何帮助都将是极好的...


3
>前面是否有引号?还是确实缺失了? - nhahtdh
2
你的编程语言/工具/环境是什么? - Martin Ender
C#和Visual Studio。 - Soeren
4个回答

9

尝试对所有a标签使用此方法:

/<a [^>]*\bhref\s*=\s*"[^"]*SPECIFICWORD.*?<\/a>/

或者只对链接进行处理(在第一个捕获组中):
/<a [^>]*\bhref\s*=\s*"([^"]*SPECIFICWORD[^"]*)/

如果您使用PHP,对于该链接:
preg_match_all('/<a [^>]*\bhref\s*=\s*"\K[^"]*SPECIFICWORD[^"]*/', $text, $results);

1
非常感谢大家!!!你们给了我很多好的帮助和答案。我会把第一个回答作为正确答案接受。真希望我能够接受所有人的答案... - Soeren

6
这个应该符合您的需求:
<a href="[^"]*?specificword.*?">.*?</a>

演示


如果你想允许其他属性在你的锚点上,并且更加宽容地处理内部空格,你可以尝试:

<a( [^>]*?)? href="[^"]*?specificword.*?"( .*?)?>.*?</a>

演示


当然,您也可以使用非捕获组(?:...)

<a(?: [^>]*?)? href="[^"]*?specificword.*?"(?: .*?)?>.*?</a>

演示


最后,如果您想允许在href属性中使用简单引号:

<a(?: [^>]*?)? href=(["'])[^\1]*?specificword.*?\1(?: .*?)?>.*?</a>

演示


最后但并非不重要的是:如果想捕获URL,只需在[^\1]*?specificword.*? 部分周围加上圆括号即可:

<a(?: [^>]*?)? href=(["'])([^\1]*?specificword.*?)\1(?: .*?)?>.*?</a>

Demo


谢谢!非常感激。我可以从你们所有人身上学到很多!! - Soeren

3
你尝试的最终正则表达式差不多可以实现。尝试这个修改后的正则表达式:
<a\s.*?href=["']([^"']*?specificword[^"']*?)[^>]*>.*?<\/a>

主要区别在于将量词变为“懒惰”的形式。

我尝试了这个方法,它似乎返回的是链接文本中包含特定单词的超链接,而不是URL中包含该单词的超链接。我需要包含该单词在URL中的超链接...我正在正则表达式设计器中尝试一些东西。它非常接近... - Soeren
这似乎与 <ahref"specificword></a> 匹配(请注意 ahref 之间缺少的空格)。 - sp00m
你说得对,我用错了,抱歉。不过,我会接受另一个答案,因为它先到了...谢谢! - Soeren
@sp00m 很好的观点。我已经编辑了问题并加入了最少1个空格。 - joe92

2
尝试使用这个模式,它正是你想要的要求。
(?=.*href=\"([^\"]*specificword[^"]*)")<a [^>]+>

如果你只想要URL值,使用Groups[1]

例如:
Regex.match("input string",@"(?=.*href=\"([^\"]*specificword[^"]*)")<a [^>]+>").Groups[1].value;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接