【问题标题】:Preg replace URL with links: MIME types failurePreg 用链接替换 ​​URL:MIME 类型失败
【发布时间】:2013-01-18 12:42:57
【问题描述】:

我在 php 函数中使用以下正则表达式来用正确的 HTML 链接替换 ​​URL:

return preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $s);

但是当 $s 有一个像这样的字符串时

<li>http://www.link.com/something.pdf</li>

函数返回

<li><a href="http://www.link.com/something.pdf</li">http://www.link.com/something.pdf</li></a></li>

有谁知道如何修改正则表达式以获取预期的字符串,即

<li><a href="http://www.link.com/something.pdf">http://www.link.com/something.pdf</a></li> ?

不排除由 '%', '?' 引入的 URL 的替换子字符串还是'&'?

【问题讨论】:

    标签: php regex url preg-replace mime-types


    【解决方案1】:

    非常简单的解决方案:

    return '<li>'.preg_replace('@(https?://([-\w.]+[-\w])+(:\d+)?(/([\w-.~:/?#\[\]\@!$&\'()*+,;=%]*)?)?)@', '<a href="$1" target="_blank">$1</a>', $s).'</li>';
    

    如果你真的想要一个正则表达式:

    return preg_replace('@(https?://([-\w.]+[-\w])+(:\d+)?(/([\w-.~:/?#\[\]\@!$&\'()*+,;=%]*)?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
    

    【讨论】:

    • 谢谢,但不完全是。如果我应用您的解决方案,我周围的“
    • ”就会消失。是否可以在不破坏布局的情况下从链接中排除 ,以便我得到最后一行代码的形式?
  • 谢谢,最后两个问题:(i)太松:一些“
  • 我编辑了我的正则表达式,如果它不起作用,请检查我的第一个解决方案,我认为它也有效。
  • 太棒了!我认为一些 '%' 可能仍然会通过,但这是对我所拥有的巨大改进!非常感谢,祝您有美好的一天。
  • 添加 %: preg_replace('@(https?://([-\w.]+[-\w])+(:\d+)?(/([\w-. ~:/?#[]\@!$&\'()*+,;=%]*)?)?)@', '$1', $s);
  • 【解决方案2】:

    你的 rpattern 是不够的(捕捉所有的链接),但无论如何,你可能想要[^\s&lt;&gt;]+ 而不是[^\s&lt;&gt;]+,因为前者可以捕捉所有非空格。

    同样适用于[^\.\s]。制作这个[^\s&lt;&gt;.]。在字符类中使用时,您不需要需要转义点,所以我对这个组的添加基本上是大于和小于符号。

    【讨论】:

    • 感谢 inhan,但这当然会破坏 URL 中的所有 php 变量(以及 '%' 之后的任何字符),因为它离开了 '?'退出替换并在“%”处停止。没有这两个问题就好了……(希望大家多了解一下正则表达式,抱歉。)
    • \S 表示[^\s]。我所做的只是将&lt;&gt; 符号添加到这个不需要的字符范围中。
    • 很抱歉,但是只要 URL 中有类似 'longLink.html?id=...' 或 'longLink%C3%' 的模式,替换会在 '?' 之后留下任何内容或链接中的“%”。
    • 无论如何,您最好搜索或建立一个更好的 url 匹配规则。我只是试图修补你的。
    • 谢谢,我希望我知道如何构建一个。而且我没有发现任何特定的规则能够完成这项工作。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签