正则表达式语法问题


Regex syntax issue

可能的重复项:
微调正则表达式以跳过标签

目前我的函数看起来像这样。它将纯文本URL转换为HTML链接。

function UrlsToLinks($text){
    return preg_replace('@(https?://([-'w'.]+)+(:'d+)?(/(['w/_'.-]*('?'S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $text);
}

但是也存在一些问题。我试图做的是跳过现有链接、<img>标签中的src属性等。 无法弄清楚我需要在此函数中修改什么。

假设我们要替换的 URL 尚未在标记内,这将起作用。

function UrlsToLinks($text){
    $matches = array();
    $strippedText = strip_tags($text);
    preg_match_all('@(https?://([-'w'.]+)+(:'d+)?(/(['w/_'.-]*('?'S+)?)?)?)@', $strippedText, $matches);
    foreach ($matches[0] as $match) {       
        if (filter_var($match, FILTER_VALIDATE_URL)) {
            $text = str_replace($match, '<a href="'.$match.'" target="_blank">'.$match.'</a>', $text);
        }
    }
    return $text;
}