正则表达式,从HTML中提取具有特殊名称的href属性

时间:2016-02-20 23:18:21

标签: java regex

例如有这样一个字符串:

<a href="LINK_1" class="am"> Some Text</a>.. ANYTHING ..<a href="LINK_2" class="am"> Some Text</a><a href="SEARCHED_HREF_TO_EXTRACT" class="am"> SEARCHED_TEXT</a>..

我需要从HTML链接中提取一个&#39; href&#39;属性值,来自包含一些搜索词的链接,例如&#39; SEARCHED_TEXT&#39;在例子中。你能建议一下,如何正确地做到这一点? 不会问是否已经发送了很多时间=)

我去了这个,但不可思议的是它工作不正确..

String str = "<a href=\"LINK_1\" class=\"am\"> Some Text</a>.. ANYTHING ..<a href=\"LINK_2\" class=\"am\"> Some Text</a><a href=\"SEARCHED_HREF_TO_EXTRACT\" class=\"am\"> SEARCHED_TEXT</a>";
Pattern pattern = Pattern.compile("<a.*?href=\"(.*?)\".*SEARCHED_TEXT</a>");
Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println(matcher.group(0)); // matched whole string
    System.out.println(matcher.group(1)); // should be SEARCHED_HREF_TO_EXTRAC

我知道在href =&#34;(。*?)&#34;之后我需要进行一些谈判。接受除

之外的所有符号
</a>

找到正确的HREF,但无法使其正常工作:(

2 个答案:

答案 0 :(得分:1)

不要在这里使用正则表达式,因为它不适合处理嵌套结构(在Java中使用的最后正则表达式,因为它不支持递归),如HTML / XML
(更多信息:Can you provide some examples of why it is hard to parse XML and HTML with a regex?)。

正确的工具是HTML / XML解析器。我可能会选择jsoup,因为它的简单性和CSS查询支持。

所以你的代码看起来像:

String html = "<a href=\"LINK_1\" class=\"am\"> Some Text</a>.. ANYTHING ..<a href=\"LINK_2\" class=\"am\"> Some Text</a><a href=\"SEARCHED_HREF_TO_EXTRACT\" class=\"am\"> SEARCHED_TEXT</a>";
Document doc = Jsoup.parse(html);
Elements links = doc.select("a:contains(SEARCHED_TEXT)"); //contains is case-insensitive
System.out.println(links.attr("href"));

或者如果您希望找到许多链接迭代找到的元素并从每个元素中获取href属性:

for(Element link : links){
    System.out.println(link.attr("href"));
}

答案 1 :(得分:1)

好吧,如果我正确阅读,你想要提取文本与搜索词匹配的链接的href。

如果是这种情况,可以通过略微修改正则表达式来实现

    String str = "<a href=\"LINK_1\" class=\"am\"> Some Text</a>.. ANYTHING ..<a href=\"LINK_2\" class=\"am\"> Some Text</a><a href=\"SEARCHED_HREF_TO_EXTRACT\" class=\"am\"> SEARCHED_TEXT</a>";

    Pattern regex = Pattern.compile("<a\\s*href=[\"']([^'\"]+?)[\"'][^>]*?>\\s*SEARCHED_TEXT\\s*</a>", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Matcher regexMatcher = regex.matcher(str);
    while (regexMatcher.find()) {
        System.out.println(regexMatcher.group(1));
    }

上面的代码段,只会提取SEARCHED_HREF_TO_EXTRACT。