【问题标题】:regex to match and <a href>?正则表达式匹配和 <a href>?
【发布时间】:2012-04-07 07:08:50
【问题描述】:

我发现此代码张贴在 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);
}

但是,即使它们已经是超链接的一部分,它似乎也会将它们更改为超链接,因此您最终会得到&lt;a href="&lt;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);
}
}

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

【问题讨论】:

标签: php regex


【解决方案1】:

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

【讨论】:

  • 这仅检查它是否直接在href前面,但它不会检查它是否在其中的某个地方或是否在文本节点中。嵌套链接是个坏主意。如果 php 支持通配符lookbehinds,这将起作用,但它不支持。 Lookbehinds 必须是预定义的长度。
  • Erm... 这确保 url 前面没有 href=",这意味着它不在 href 属性内。你可以更暴力,只用(?&lt;!=") 来测试="。我自己的代码只有",因为输入中" 的真实实例已经转换为&amp;quot;
  • @Kolink 我添加了那个并输入了&lt;a href="http://www.google.com"&gt;google&lt;/a&gt;,它仍然断开了链接。
猜你喜欢
  • 2011-06-10
  • 2020-04-13
  • 2022-01-05
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2011-05-25
相关资源
最近更新 更多