PHP正则表达式禁止太短的URL

时间:2012-11-25 08:27:20

标签: php regex preg-replace

我有一个正则表达式,可以在文本中找到网址并用链接替换它们

preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank" rel="nofollow">\0</a>', $text );

问题是,当某人键入包含“ie”的文本时,它也将其转换为链接,这不应该发生。如何限制此正则表达式以替换长度超过3个字符的字符串?

我尝试了{3,},但它无效。

preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)
([-A-Z0-9+&#/%=~_|$?!:,.]{3,})*[A-Z0-9+&#/%=~_|$]@i', '
<a href="\0" target="_blank" rel="nofollow">\0</a>', $text );

1 个答案:

答案 0 :(得分:2)

您可以使用preg_replace_callback检查所捕获的文字是否至少有56个字符:

preg_replace_callback( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)([-A-Z0-9+&#/%=~_|$?!:,.]{3,})*[A-Z0-9+&#/%=~_|$]@i', function($matches){
   if(strlen($matches[0])>5){
      return '<a href="'.$matches[0].'" target="_blank" rel="nofollow">'.$matches[0].'</a>';
    }else{
       return $matches[0];
     }
   }, $text );