【问题标题】:Match all urls that aren't wrapped into <a> tag匹配所有未包含在 <a> 标记中的 url
【发布时间】:2009-08-18 21:56:33
【问题描述】:

我正在寻找一种正则表达式模式,它可以匹配 HTML 中未包装到“a”标签中的 url,以便进一步将它们包装到“a”标签中(即突出显示所有未突出显示的链接)。

输入是简单的 HTML,允许使用“a”、“b”、“i”、“br”、“p”“img”标签。所有其他 HTML 标签不应出现在输入中,但上述标签可以以任意组合出现。

因此,pattern 应该忽略所有属于现有 'a' 标签一部分的 url,并匹配所有其他链接,这些链接只是纯文本,没有包装到 'a' 标签中,因此没有突出显示,也不是超链接。如果模式能匹配以 http://、https:// 或 www. 开头并以 .net、.com 结尾的 url,那就太好了。如果 URL 不是以 http://、https:// 或 www 开头,则为 .org。

我尝试过类似 '(?!]+>)http://[a-zA-Z0-9._-]+(?!)' 之类的方法来匹配比我上面描述的更简单的情况,但似乎这个任务不是太明显了。

非常感谢您的帮助。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可以使用BeautifulSoup 或类似名称来排除所有已经属于链接的网址。

    然后,您可以将纯文本与已经存在的 url 正则表达式之一匹配(谷歌“url 正则表达式”,您想要哪个取决于您想要获得的花哨)。

    【讨论】:

    • +1 推荐 BeautifulSoup。这个问题不太适合纯正则表达式解决方案。
    【解决方案2】:

    根据定义,使用单个正则表达式解析 HTML 几乎是不可能的,因为正则表达式没有状态。

    改为构建/使用真正的解析器。也许是BeautifulSouphtml5lib

    以下代码使用 BeautifulSoup 从页面中提取所有链接:

    from BeautifulSoup import BeautifulSoup
    from urllib2 import urlopen
    
    url = 'http://stackoverflow.com/questions/1296778/'
    stream = urlopen(url)
    soup = BeautifulSoup(stream)
    for link in soup.findAll('a'):
        if link.has_key('href'):
            print unicode(link.string), '->', link['href']
    

    同样,您可以使用soup.findAll(text=True) 找到所有文本并在那里搜索网址。

    搜索 url 也非常复杂 - 你不会相信 url 上允许的内容。一个简单的搜索显示了数千个示例,但没有一个与规范完全匹配。您应该尝试更适合您的方法。

    【讨论】:

      【解决方案3】:

      谢谢各位!以下是我的解决方案:

      from django.utils.html import urlize # Yes, I am using Django's urlize to do all dirty work :)
      
      def urlize_html(value):
          """
          Urlizes text containing simple HTML tags.
          """
          A_IMG_REGEX = r'(<[aA][^>]+>[^<]+</[aA]>|<[iI][mM][gG][^>]+>)'
          a_img_re = re.compile(A_IMG_REGEX)
      
          TAG_REGEX = r'(<[a-zA-Z]+[^>]+>|</[a-zA-Z]>)'
          tag_re = re.compile(TAG_REGEX)
      
          def process(s, p, f):
              return "".join([c if p.match(c) else f(c) for c in p.split(s)])
      
          def process_urlize(s):
              return process(s, tag_re, urlize)
      
          return process(value, a_img_re, process_urlize)
      

      【讨论】:

      • 我不必想太多就可以创建 html,这会使它失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2011-02-13
      • 1970-01-01
      • 2011-03-15
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多