【问题标题】:Regex ignore URL already in HTML tags正则表达式忽略 HTML 标记中已有的 URL
【发布时间】:2012-03-22 23:52:51
【问题描述】:

我的正则表达式有点问题

我已经为我的网站制作了一个自定义 BBcode,但我也希望解析 URL。

我正在使用 preg_replace,这是用于识别 URL 的模式:

/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/is

这很好用,但是如果 URL 在 [img][/img] 块内,上述模式也会将其拾取并产生如下结果:

//[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 答案的第二条评论。

【问题讨论】:

    标签: php html regex preg-replace url-parsing


    【解决方案1】:

    试试这个

    (?<!href=")(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])
    

    here on Regexr

    为了使其更通用,您可以简化后向检查以仅检查“=”

    (?<!=")(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])
    

    it on Regexr

    (?&lt;!href=") 是一个否定的lookbehind 断言,它确保你的模式之前没有“href="”。

    \b 是一个单词边界,它将链接的开头锚定到从非单词到单词字符的变化。没有这个,lookbehind 将毫无用处,它会从“ttp://...”开始匹配。

    【讨论】:

    • @Moe 然后简化后向检查以仅检查“=”这样的(?&lt;!=")(\b[\w]+:\/\/[\w-?&amp;;#~=\.\/\@]+[\w\/])Regexr
    • 成功了!我想了解更多关于 (?
    • @Moe regular-expressions.info 通常是学习正则表达式的好地方,see here the lookaround chapter
    • 这不能在除 chrome 之外的浏览器上运行。引发错误。
    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 2012-07-29
    • 2015-10-02
    • 1970-01-01
    • 2015-05-08
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多