没有正则表达式匹配的链接标签没有正则表达式匹配的链接标签(regex matching links

2019-05-12 03:35发布

(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>后,该链接不应该mathced。怎样才能做到呢?

这些应该匹配:

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

为什么我需要这个?:我想每个环节可以点击即使它不是锚标记之间。

Answer 1:

与所有有关使用正则表达式来解析HTML,如果你想使用正则表达式该任务的免责声明,这将工作:

$regex="~<a.*?</a>(*SKIP)(*F)|http://\S+~";

见演示 。

这个问题是该技术的一个经典案例在这个问题解释“正则表达式匹配的模式,不包括......”

交替的左侧| 比赛完全<a ...tags </a>然后故意失败,之后引擎跳到字符串中的下一个位置。 右侧的网址匹配,我们知道他们是正确的,因为他们没有通过左边的表达式匹配。

该URL的正则表达式我把在右边,可以细化,只需使用任何适合您的需求。

参考

  • 如何匹配(或替换)的模式,除了在情况S1,S2,S3 ...
  • 文章关于除非匹配的模式...


Answer 2:

您需要添加lookaround s到你的正则表达式比照:

  • 正则表达式负前瞻
  • 前瞻和回顾后零长度断言


文章来源: regex matching links without tag