【问题标题】:Regex to extract hyperlink containing a specific word正则表达式提取包含特定单词的超链接
【发布时间】:2017-01-12 18:14:19
【问题描述】:

我需要从一段文本中提取一个超链接,其中包含 url 中的特定单词。示例;

“这是一个带有指向某个页面的链接的文本。单击此链接<a href="/server/specificword.htm>this is a link to a page</a> 以查看该页面。这是一个没有“特定单词”一词的链接:<a href="/server/mypage.htm>this is a link without the word "specificword" in the url</a>

所以,我需要解析这个文本,检查超链接,看看其中一个是否包含“特定词”这个词,然后提取整个超链接。然后我会这样结束:

<a href="/server/specificword.htm>this is a link to a page</a>

我需要在 URL 中包含特定字词的超链接,例如。 /server/specificword.htm,不在链接文本中

我尝试过的一个正则表达式是这个:/(&lt;a[^&gt;]*&gt;.*?&lt;/a&gt;)|specificword/ 这将匹配文本中的所有超链接,或“特定词”。如果文本有多个链接,没有“特定词”这个词,我也会得到这些。

另外,我也试过这个,但没有任何效果:

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

我的正则表达式技能到此结束,任何帮助都会很棒......

【问题讨论】:

  • &gt; 之前是否有引号或者它实际上是缺失的?
  • 你的编程语言/工具/环境是什么?
  • C# 和 Visual Studio。

标签: regex


【解决方案1】:

对所有的 a 标签试试这个:

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

或仅用于链接(在第一个捕获组中):

/<a [^>]*\bhref\s*=\s*"([^"]*SPECIFICWORD[^"]*)/

如果你使用php,链接:

preg_match_all('/<a [^>]*\bhref\s*=\s*"\K[^"]*SPECIFICWORD[^"]*/', $text, $results);

【讨论】:

  • 谢谢大家!!!很多很棒和有用的答案。我将接受这个作为正确答案,因为它是第一个进来的。希望我能接受你所有的答案......
【解决方案2】:

这个应该适合你的需要:

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

Demo


如果你想在你的锚 tar 上允许其他属性,并且对内部空间更加自负,你可以尝试:

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

Demo


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

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

Demo


最后,如果您想为您的 href 属性提供简单的引号:

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

Demo


最后但同样重要的是:如果您想捕获 URL,只需在 [^\1]*?specificword.*? 部分周围加上括号:

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

Demo

【讨论】:

  • 谢谢!真的很感激这一点。我真的可以从你们所有人身上学到很多东西!!
【解决方案3】:

您尝试的最后一个正则表达式几乎完成了。试试这个改动:

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

主要区别在于使量词“惰性”。

【讨论】:

  • 我试过这个,它似乎在链接文本中返回带有特定单词的超链接,而不是在 url 中。我需要带有 url 中单词的超链接...我正在正则表达式设计器中尝试一些东西。很近了……
  • 这似乎与&lt;ahref"specificword&gt;&lt;/a&gt; 匹配(请参阅ahref 之间缺少的空格)。
  • 你说得对,我用错了,对不起。但是,我将接受另一个答案,因为它是第一位的......谢谢!
  • @sp00m 好点。我已将问题编辑为至少包含 1 个空格。
【解决方案4】:

试试这个模式这是你想要的确切要求

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

如果您只想要 url 值,请使用 Groups[1] 喜欢:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多