我正在寻找一个正则表达式模式,它可以匹配HTML中没有包含在'a'标签中的URL,以便将它们进一步包装成'a'标签(即突出显示所有未突出显示的链接)。 / p>
输入是简单的HTML,允许使用'a','b','i','br','p''img'标签。所有其他HTML标记不应出现在输入中,但上面提到的标记可以以任何组合出现。
因此,模式应该省略作为现有“a”标记的一部分的所有网址,并匹配所有其他链接,这些链接只是未包含在“a”标记中的纯文本,因此不会突出显示,也不是超链接。如果模式匹配以http://,https://或www。开头并以.net,.com结尾的网址,那将是一件好事。或.org如果网址不是以http://,https://或www。
开头我尝试了类似'(?!< [aA] [^>] +>)http://[a-zA-Z0-9._-]+(?!)'的内容,以匹配比上述更简单的情况,但似乎这项任务并不那么明显。
非常感谢您的帮助。
答案 0 :(得分:5)
您可以使用BeautifulSoup或类似内容排除已经属于链接的所有网址。
然后你可以将纯文本与其中一个已经存在的url正则表达式匹配(谷歌“url正则表达式”,你想要的那个取决于你想得到多少花哨)。
答案 1 :(得分:5)
根据定义,使用单个正则表达式解析HTML几乎是不可能的,因为正则表达式没有状态。
构建/使用真正的解析器。可能是BeautifulSoup或html5lib。
以下代码使用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)
查找所有文字并在那里搜索网址。
搜索网址也非常复杂 - 您不会相信网址上允许的内容。一个简单的搜索显示了数千个示例,但没有一个完全符合规范。你应该尝试一下对你有用的东西。
答案 2 :(得分:-2)
谢谢你们!以下是我的解决方案:
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)