带有正则表达式的PHP文本到HTML href链接(忽略图像链接)
我需要将纯文本链接转换为HTML链接的正则表达式。 我的代码是:带有正则表达式的PHP文本到HTML href链接(忽略图像链接),php,html,regex,Php,Html,Regex,我需要将纯文本链接转换为HTML链接的正则表达式。 我的代码是: preg_replace('/(((f|ht){1}tps:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i', '<a href="\\1" target="_blank">\\1</a>', $text); preg\u replace('/((f|ht){1}tps:\/\/)[-a-zA-Z0-9@:%\+.~\?&\/\/=
preg_replace('/(((f|ht){1}tps:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
'<a href="\\1" target="_blank">\\1</a>', $text);
preg\u replace('/((f|ht){1}tps:\/\/)[-a-zA-Z0-9@:%\+.~\?&\/\/=]+/i',
“$文本);
但是这个表达式也会使图像url指向href。
所以,我的问题是,如果url位于img标记中,如何避免
案文:
https://yahoo.com 这是我的图像
我的表达式的结果:这是我的图像
我想要这张
这是我的图片可以使用反向查找操作符(?),但可能不是最有效的方法,因为引擎会大量回溯。也许你可以在预替换之前剥离标签('img')
lookbehind的另一个缺点是它必须是固定长度的。这意味着你不能抓住img
,因为它和src
之间可能有额外的属性。无论如何,如果你真的想使用它,你的正则表达式会是这样的
preg_replace('/(?<!src=[\'"])(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
'<a href="\\1" target="_blank">\\1</a>', $text);
preg_replace('/(?为什么有两次?我看到的唯一区别是https中的s,但您可以这样实现:
preg_replace('/(((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i',
'<a href="\\1" target="_blank">\\1</a>', $text);
preg\u replace('/((f|ht){1}tps?:\/\/)[-a-zA-Z0-9@:%\+.~\?&\/\/=]+/i',
“$文本);
IMHO你得到的结果是因为第一行做了你想要的,第二行“又做了一次”。如果你的输入在一行中有链接和img url,那么你可以将两个正则表达式组合成一个长正则表达式,同时捕获这两个正则表达式。这样,正则表达式的第二个每个“一半”将只替换它的“部分”在这一行中,你应该显示你的纯文本,然后是预期的转换输出。对于每个示例,这将更容易帮助,我为你标记了php
,因为你使用的是preg\u replace()
它肯定与regex