2012-08-14 79 views
-2

可能重复:
Finetune Regex to skip tags正则表达式的语法问题

目前我的功能看起来是这样的。它将纯文本URL转换为HTML链接。

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

但也有一些问题。我想要做的是跳过现有的链接,src属性<img>标签等。无法弄清楚我需要修改这个功能。

+0

你试图解析的字符串是什么? – 2012-08-14 19:26:39

+5

使用正则表达式实现您的期望功能非常困难,如果不是不可能的话,更不用说单个正则表达式。您确实应该使用HTML解析器,仅在HTML节点的文本内容中查找链接。 – nickb 2012-08-14 19:26:56

+4

你需要做的是使用HTML解析器来提取文本节点,并只通过上述函数运行* them *。试图修改它,以便它会忽略HTML和HTML的部分将会降低托尼小马的愤怒,我们都将在火热的深度燃烧。无论是那个还是你的应用程序都是不安全和不可靠的,其中之一。 – DaveRandom 2012-08-14 19:28:06

回答

1

这会工作,假设我们要替换的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; 
}