将“仅”纯文本转换为超链接,但忽略现有的超链接

时间:2017-03-12 09:18:48

标签: php html hyperlink preg-replace

我需要将纯链接转换为超链接,但只能转换纯文本,必须跳过现有的超链接

在以下情况下,文本被视为链接:

  1. 从该行的开头或其前面的空格开始 即(^|\s)
  2. 未包含在html超链接或任何其他html标记内 即[^"|']
  3. 在该行的末尾结束或在其后存在空格
  4. 例如

    https://link1  http://link2
    
    <-a href="http://ignored">http:-ignored<-/a>
    

    链接公式为:

    ((?:https?://|ftps?://|www\.).*)
    

    不考虑任何其他选项,即http ...

    之后的任何文字

    - 将超链接转换为普通链接并且不允许再次重新转换,因为文本将丢失

1 个答案:

答案 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);