链接的正则表达式URLS

时间:2013-04-08 15:00:11

标签: php regex

我使用以下正则表达式将网址转换为href链接。它工作得很好,但是当我使用带有背景图像的样式标签时,我发现了它的错误。

    /**
 * Convert urls in a string to a html link
 * @return string
 */
public static function ConvertUrlsToHtml($str)
{
    $str = preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0">\0</a>', $str);
    return $str;
}

如果我使用以下内容......

<div class="inner-left" style="background-image: url(http://www.somewebsite/background.jpg);"></div>

它也将背景图像转换为href。

有谁知道如何调整正则表达式来忽略样式标记?

1 个答案:

答案 0 :(得分:1)

您可以从删除HTML标记开始,因为您不想替换标记内的网址。 style=确实如此,<img src=...<a href=...>也是如此。

function ConvertUrlsToHtml($str)
{
  $strNoTags = strip_tags($str);

  if (preg_match_all( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', $strNoTags, $matches)) {

    foreach ($matches[0] as $match) {
      $str = str_replace($match, "<a href=\"$match\">$match</a>", $str);
    }
  }

  return $str;
}

它的作用:

  1. 删除标记
  2. 获取标记免费字符串中的所有网址
  3. 通过原始字符串中的链接替换找到的网址
  4. 正如评论所述,您可以先尝试使用HTML解析器来提取文本,而不是strip_tags