0

我使用以下正则表达式将 url 转换为 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。

有谁知道我可以如何调整正则表达式以忽略样式标签?

4

1 回答 1

1

您可以从删除 HTML 标签开始,因为您不想替换标签内的 URL。对 是对的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. 获取无标签字符串中的所有 URL
  3. 用原始字符串中的链接替换找到的 URL

正如评论所言,您总是可以先尝试使用 HTML 解析器来提取文本,而不是strip_tags.

于 2013-04-08T16:36:59.560 回答