我正在寻找一个正则表达式模式,它可以匹配HTML中没有包装到'a'标签中的URL,以便将它们进一步包装成'a'标签(即突出显示所有非突出显示的链接).
输入是简单的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 ._-] +(?!)'来匹配比我更简单的情况如上所述,但似乎这个任务并不那么明显.
非常感谢您的帮助.
您可以使用BeautifulSoup或类似方法排除已经属于链接的所有网址.
然后你可以将纯文本与其中一个已经存在的url正则表达式匹配(谷歌"url正则表达式",你想要的那个取决于你想要得到的花哨程度).
根据定义,使用单个正则表达式解析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']
Run Code Online (Sandbox Code Playgroud)
同样,你可以找到所有文本使用soup.findAll(text=True)并在那里搜索网址.
搜索网址也非常复杂 - 你不会相信网址上允许的内容.一个简单的搜索显示了数千个示例,但没有一个完全符合规范.你应该尝试一下对你有用的东西.