【发布时间】: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( '@(?<!url\()(?<![.*">])...