【问题标题】:PHP text to HTML href link (ignore image link) with regular expression [duplicate]带有正则表达式的PHP文本到HTML href链接(忽略图像链接)[重复]
【发布时间】:2016-01-12 06:31:07
【问题描述】:

我需要将纯文本链接转换为 HTML 链接的正则表达式。 我的代码是:

preg_replace('/(((f|ht){1}tps:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
                   '<a href="\\1" target="_blank">\\1</a>', $text);

但是这个表达式也会使图像 url 成为 href。 所以我的问题是如果网址在 img 标签中,如何避免。

正文: https://yahoo.com this is my image &lt;img src="https://img.com/img.jpg"&gt;

结果与我的表情:&lt;a href="https://yahoo.com"&gt;https://yahoo.com&lt;/a&gt; this is my image &lt;img src="&lt;a href="https://img.com/img.jpg"&gt;https://img.com/img.jpg&lt;/a&gt;"&gt;

我想要这个&lt;a href="https://yahoo.com"&gt;https://yahoo.com&lt;/a&gt; this is my image &lt;img src="http://img.com/img.jpg"&gt;

【问题讨论】:

  • 您应该在每个示例之后显示您拥有的确切纯文本,然后是预期的转换输出,这会更容易提供帮助
  • 我为你标记了php,因为你使用的是preg_replace(),所以regex可能很重要

标签: php html regex


【解决方案1】:

可以使用负后向操作符(?&lt;!text),但可能不是最有效的方法,因为引擎会回溯很多。也许你可以在preg_replace 之前做strip_tags('img')

lookbehind 的另一个缺点是它必须是固定长度。这意味着您无法抓住img,因为它和src 之间可能存在其他属性。无论如何,如果你真的很想使用它,你的正则表达式应该是这样的

preg_replace('/(?<!src=[\'"])(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
               '<a href="\\1" target="_blank">\\1</a>', $text);

另外,不需要第二个表达式,正如Gavriel 指出的那样,只需添加一个s?

【讨论】:

    【解决方案2】:

    为什么你有两次?我看到的唯一区别是 https 中的 s,但您可以这样实现:

    preg_replace('/(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
                   '<a href="\\1" target="_blank">\\1</a>', $text);
    

    恕我直言,你得到了结果,因为第一行做了你想要的,第二行“又做了一次”。如果您的输入在一行中包含链接和 img url,那么您可以将 2 个正则表达式组合成 1 个长的,同时捕获两者。这样,正则表达式的第二个“一半”只会替换它的“部分”行

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多