Javascript 正则表达式来提取所有链接和相应的链接文本

Javascript 正则表达式来提取所有链接和相应的链接文本,javascript,python,regex,perl,Javascript,Python,Regex,Perl,我是正则表达式的新手,我正在尝试解决以下两个问题: 编写一个正则表达式,从HTML页面中提取所有链接和相应的链接文本。例如,如果要分析: text1 <a href="http://example.com">hello, world</a> text2 text1 text2 并得到结果 http://example.com <tab> hello, world http://example.com 你好,世界 执行相同的操作,但也要处理嵌套的情况

我是正则表达式的新手,我正在尝试解决以下两个问题:

  • 编写一个正则表达式,从HTML页面中提取所有链接和相应的链接文本。例如,如果要分析:

     text1 <a href="http://example.com">hello, world</a> text2
    
    text1 text2
    
  • 并得到结果

    http://example.com <tab> hello, world
    
    http://example.com  你好,世界
    
  • 执行相同的操作,但也要处理嵌套的情况:

      text1 <a href="http://example.com" onclick="javascript:alert('<b>text2</b>')">hello, world</a> text3
    
    text1 text3
    
  • 到目前为止,我仍在回答第一个问题,我已经尝试了几种方法。我想我对第一个问题最好的回答是正则表达式
    (?你好,世界


    这对我来说似乎已经足够好了,但我不知道该如何处理第二部分。任何帮助或见解都将不胜感激。

    如果您要使用类似HTML解析器的方法来解决此问题,只需找到
    a
    元素,使用类似字典的方式访问
    href
    属性和
    get\te即可xt()
    用于获取元素的文本:

    In [1]: from bs4 import BeautifulSoup
    
    In [2]: l = [
        """text1 <a href="http://example.com">hello, world</a> text2""", 
        """text1 <a href="http://example.com" onclick="javascript:alert('<b>text2</b>')">hello, world</a> text3"""
    ]
    
    In [3]: for s in l:
                soup = BeautifulSoup(s, "html.parser")
                link = soup.a
                print(link["href"] + "\t" + link.get_text())
        ...:     
    http://example.com  hello, world
    http://example.com  hello, world
    
    [1]中的
    :从bs4导入BeautifulSoup
    在[2]中:l=[
    “text1 text2”,
    “”“text1 text3”“”
    ]
    In[3]:对于l中的s:
    soup=BeautifulSoup(s,“html.parser”)
    链接=汤
    打印(链接[“href”]+“\t”+链接。获取文本()
    ...:     
    http://example.com  你好,世界
    http://example.com  你好,世界
    
    对于正则表达式,有时最好查看不应该捕获的内容,而不是应该捕获的内容。此perl正则表达式应该可靠地捕获简单链接及其相关文本:

    #!perl
    
    use strict;
    use warnings;
    
    my $sample = q{text1 <a href="http://example.com">hello, world</a> text2};
    
    my ($link, $link_text) = $sample =~ m{<a href="([^"]*)"[^>]*>(.*?)</a>};
    
    print "$link \t $link_text\n";
    
    1;
    
    #!perl
    严格使用;
    使用警告;
    my$sample=q{text1 text2};
    my($link,$link_text)=$sample=~m{};
    打印“$link\t$link\u text\n”;
    1.
    
    这将打印:

    http://example.com <tab> hello, world
    
    http://example.com  你好,世界
    
    要分解它正在做的事情:

    第一个捕获,
    ([^“]*)
    ,在href属性中查找0个或更多非双引号的字符。方括号用于列出字符范围,前导克拉告诉正则表达式查找不在此范围内的任何字符

    类似地,我使用
    [^>]*>
    查找
    标记的结束括号,而无需担心标记中可能有哪些其他属性

    最后,
    (.*)
    是一个0或更多的非贪婪捕获(用问号表示),仅捕获该链接内的所有文本。如果没有非贪婪指示符,它将所有文本与文档中最后一个结束标记
    匹配


    希望这能帮助你解决作业的第2部分。:)

    ReEX在嵌套中是不好的。你应该考虑一个真正的HTML解析器。那么我应该怎么回答这个问题呢?就说PLZ没有HTML解析吗?问题来自哪里?问题2好像是你不使用正则表达式的确切原因。我用ReGEX101.com测试这些,所以我用的是Python语法,但是他们可能想要它。谢谢@PatrickHaugh,我几乎给出了我想要的结果。我对这一点很在行,我真的不知道结果分为第1组和第2组是否重要。