正则表达式匹配和<a href="">?</a>

时间:2012-04-06 23:06:02

标签: php regex

我发现此代码发布在SO上,将文本链接更改为超链接:

function auto_link_text($text)
{ 
   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
   $url       = array_shift($matches);
   $url_parts = parse_url($url);

   $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
   $text = preg_replace("/^www./", "", $text);

   $last = -(strlen(strrchr($text, "/"))) + 1;
   if ($last < 0) {
       $text = substr($text, 0, $last) . "&hellip;";
   }

   return sprintf(\'<a rel="nowfollow" href="%s">%s</a>\', $url, $text);
  ');

  return preg_replace_callback($pattern, $callback, $text);
}

但是,它似乎将它们更改为超链接,即使它们已经是超链接的一部分,因此您最终会得到类似<a href="<a href(等)的内容。我想我能做的是检查已经格式化的超链接,如果我找不到,我可以做这个功能。或者甚至把检查放在功能中。如下所示:

  function auto_link_text($text)
{
  if preg_match(proper stuff in here){
      return $text;
        }else{
       $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
       $callback = create_function('$matches', '
   $url       = array_shift($matches);
   $url_parts = parse_url($url);

   $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
   $text = preg_replace("/^www./", "", $text);

   $last = -(strlen(strrchr($text, "/"))) + 1;
   if ($last < 0) {
       $text = substr($text, 0, $last) . "&hellip;";
   }

   return sprintf(\'<a rel="nowfollow" href="%s">%s</a>\', $url, $text);
  ');

  return preg_replace_callback($pattern, $callback, $text);
}
}

或者应该改变函数中的正则表达式。

1 个答案:

答案 0 :(得分:2)

在正则表达式的第一个(?<!href=")之后添加#。这将确保它不在标签内。