【问题标题】:Regular Expression URLS to Links链接的正则表达式 URL
【发布时间】:2013-04-08 15:00:10
【问题描述】:

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

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

【问题讨论】:

  • 您不应该使用正则表达式来解析 html。改用 DOM。
  • 使用 DOM Parser 来解析 HTML,正则表达式是一场噩梦。
  • 那没有帮助。在这里使用 DOMDocument 不起作用,因为它不一定是 html。它只是一个可能包含或不包含任何 html 的字符串。因此,我需要在任何给定的字符串中找到 URL 的所有实例,无论是否为 html。然后我需要创建 html。
  • @SamuelDavidHudson:至少,使用 HTML Parser 会消除 HTML 中的文本(不应被替换),让您单独处理文本。
  • 尝试添加另一个负面的lookbehind:preg_replace( '@(?&lt;!url\()(?&lt;![.*"&gt;])...

标签: php regex


【解决方案1】:

您可以从删除 HTML 标签开始,因为您不想替换标签内的 URL。 style= 是这样,&lt;img src=...&lt;a href=...&gt; 也是如此。

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. 用原始字符串中的链接替换找到的 URL

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多