(http([s]?):\/\/?)(([a-zA-Z0-9]+(\.?))+)([a-zA-Z0-9]+((\.[a-zA-Z]{2,5}){1,2})((\/[a-zA-Z0-9\?&=_\-\~:/?#[\]@!\$&'()\*\+,;]*)*)((\.[a-zA-Z]{2,5}){0,2}))
这是我的正则表达式,它可以很好地匹配字符串中的链接。但我不希望它选择每个链接。如果某个链接前面有">
,或者后面有</a>
,则该链接不应该被数学化。怎么办呢?
这些应该匹配:
adasdas http://www.stackoverflow.com asdasas
adasdasahttp://www.stackoverflow.com/something asdas
这些不应该匹配:
adasdas<a href="somelink"> http://www.stackoverflow.com </a>asdasas
adasdasa<a href="somelink">http://www.stackoverflow.com/something</a> asdas
为什么我需要这个?:我希望每个链接都是可点击的,即使它不在锚标签之间。
答案 0 :(得分:11)
关于使用正则表达式来解析html的所有免责声明,如果你想使用正则表达式执行此任务,这将有效:
$regex="~<a.*?</a>(*SKIP)(*F)|http://\S+~";
请参阅the demo。
此问题是此问题中向"regex-match a pattern, excluding..."
解释的技术的典型案例交替|
的左侧匹配完成<a ...tags </a>
然后故意失败,之后引擎跳到字符串中的下一个位置。右侧与网址匹配,我们知道它们是正确的,因为它们与左侧的表达不匹配。
我把右边的正则表达式放在右边,可以精炼,只需使用适合你需要的东西。
参考
答案 1 :(得分:0)
您需要将lookaround
添加到正则表达式c.f。: