Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有正则表达式的PHP文本到HTML href链接(忽略图像链接)_Php_Html_Regex - Fatal编程技术网

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

带有正则表达式的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@:%\+.~\?&\/\/=

我需要将纯文本链接转换为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@:%\+.~\?&\/\/=]+/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