我的正则表达式有点问题
我为我的网站制作了自定义 BBcode,但我也希望 URL 也被解析。
我正在使用 preg_replace,这是用于识别 URL 的模式:
/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/is
效果很好,但是如果 URL 在 [img][/img] block 中,上面的模式也会选择它并产生如下结果:
//[img]http://url.com/toimg.jeg[/img] will produce this result:
<img src="<a href="http://url.com/toimg.jeg" target="_blank">/>
//When it should produce:
<img src="http://url.com/toimg.jeg"/>
我试过用这个:
/([^"][\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/][^"])/is
没有运气。
我们将不胜感激。
编辑: 有关解决方案,请参阅关于 stema 答案的第二条评论。
最佳答案
试试这个
(?<!href=")(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])
为了让它更通用,你可以简化你的lookbehind,只检查“=”
(?<!=")(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])
参见 it on Regexr
(?<!href=")
是一个否定的回顾断言,它确保在你的模式之前没有“href=”。
\b
是一个单词边界,它将链接的开头锚定为从非单词字符到单词字符的变化。没有这个,lookbehind 将毫无用处,它将从“ttp://...”开始匹配。
关于php - 正则表达式忽略 HTML 标签中已有的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567836/