正则表达式匹配没有<a> tag</a>的链接

时间:2014-07-09 10:59:44

标签: php regex hyperlink anchor

(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

为什么我需要这个?:我希望每个链接都是可点击的,即使它不在锚标签之间。

2 个答案:

答案 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。: