6

我需要从一段文本中提取一个包含 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,不在链接文本中

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

另外,我试过这个,但它什么都没有:

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

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

4

4 回答 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);
于 2013-04-19T08:53:50.630 回答
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>

演示

于 2013-04-19T09:23:54.860 回答
3

您尝试的最终正则表达式几乎拥有它。试试这个改变:

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

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

于 2013-04-19T08:58:14.067 回答
2

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

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

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

Regex.match("input string",@"(?=.*href=\"([^\"]*specificword[^"]*)")<a [^>]+>").Groups[1].value;
于 2013-04-19T09:42:18.643 回答