我需要将纯链接转换为超链接,但只能转换纯文本,必须跳过现有的超链接
在以下情况下,文本被视为链接:
(^|\s)
[^"|']
例如
https://link1 http://link2
<-a href="http://ignored">http:-ignored<-/a>
链接公式为:
((?:https?://|ftps?://|www\.).*)
不考虑任何其他选项,即http ...
之后的任何文字- 将超链接转换为普通链接并且不允许再次重新转换,因为文本将丢失
答案 0 :(得分:0)
我没有使用.*
来匹配链接,而是使用[^\s"\']+
,这意味着一个或多个不是空格或引号的字符:
$str = <<<EOD
https://link1 http://link2
<-a href="http://ignored">http:-ignored<-/a>
EOD;
$str = preg_replace('~(?:^|\s)((?:https?://|ftps?://|www\.)[^\s"\']+)(?:\s|$)~', '<a href="$1">$1</a>', $str);
echo $str,"\n";
<强>输出:强>
<a href="https://link1">https://link1</a><a href="http://link2">http://link2</a>
<-a href="http://ignored">http:-ignored<-/a>
如果您想保留链接之前或之后的空格:
$str = preg_replace('~(^|\s)((?:https?://|ftps?://|www\.)[^\s"\']+)(\s|$)~', '<a href="$2">$1$2$3</a>', $str);