要匹配的正则表达式,并且<;a href>;


regex to match and <a href>?

我在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);
}
}

或者可能应该更改函数中的正则表达式。

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