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

时间:2016-01-12 06:31:07

标签: php html regex

我需要正则表达式将纯文本链接转换为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 <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">

2 个答案:

答案 0 :(得分:0)

可能使用负向后视运算符(?<!text),但可能不是最有效的方式,因为引擎会重新跟踪很多。也许你可以在strip_tags('img')之前preg_replace做什么?

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?

答案 1 :(得分:0)

你为什么要两次?我看到的唯一区别是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个长的表达式同时捕获两个正则表达式。这样,正则表达式的第二个“一半”只会替换它的行“部分”