我需要正则表达式将纯文本链接转换为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">
答案 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个长的表达式同时捕获两个正则表达式。这样,正则表达式的第二个“一半”只会替换它的行“部分”