带有正则表达式的PHP文本到HTML href链接(忽略图像链接)


PHP text to HTML href link (ignore image link) with regular expression

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

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

但是这个表达式也会使图像url变为href。所以我的问题是,如果url像img标签一样,如何避免。

正文:https://yahoo.com this is my image <img src="https://img.com/img.jpg">

我的表达式的结果:<a href="https://yahoo.com">https://yahoo.com</a> this is my image <img src="<a href="https://img.com/img.jpg">https://img.com/img.jpg</a>">

我想要这个<a href="https://yahoo.com">https://yahoo.com</a> this is my image <img src="http://img.com/img.jpg">

使用负查找运算符(?<!text)是可能的,尽管可能不是最有效的方法,因为引擎会大量回溯。也许你可以在preg_replace之前做strip_tags('img')

lookbacking的另一个缺点是它必须是固定的长度。这意味着您无法获取img,因为它和src之间可能有其他属性。无论如何,如果你真的很想使用它,你的正则表达式会像这个

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

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

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

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

IMHO,你得到这个结果是因为第一行做了你想要的,而第二行"又做了一次"。如果您的输入在一行中有链接和img url,那么您可以将这2个正则表达式组合为一个长正则表达式,同时捕获这两个正则表达式。这样,正则表达式的第二个"一半"将只替换行的"一部分"