我正在尝试使用&
解析包含preg_replace
的网址。
$content = preg_replace('#https?://[a-z0-9._/\?=&-]+#i', '<a href="$0" target="_blank">$0</a>', $content);
但是我将它用于用户评论,所以我也使用htmlspecialchars()函数来阻止XSS。
function formatContributionContent($content)
{
$content = nl2br(htmlspecialchars($content));
// Regexp for mails
$content = preg_replace('#[a-z0-9._-]+@[a-z0-9._&-]{2,}\.[a-z]{2,4}#', '<a href="mailto:$0">$0</a>', $content);
// Regexp for urls
$content = preg_replace('#https?://[a-z0-9._/\?=&-]+#i', '<a href="$0" target="_blank">$0</a>', $content);
var_dump($content);
}
formatContributionContent('https://openclassrooms.com/index.php?page=3&skin=blue');
htmlspecialchars将&
转换为"&"
,因此我的正则表达式会产生错误的结果。实际上,使用以下URL。
http://www.siteduzero.com/index.php?page=3&skin=blue
我获得;
<a href="https://openclassrooms.com/index.php?page=3&" target="_blank">https://openclassrooms.com/index.php?page=3&</a>;skin=blue
答案 0 :(得分:1)
您可以添加&#34;;&#34;在你的正则表达式匹配的字符列表中,如下所示:
$content = preg_replace('#https?://[a-z0-9._/\?=&;-]+#i', '<a href="$0" target="_blank">$0</a>', $content);
这样,htmlspecialchars会在"&"
中转换"&"
个字符,但您的正则表达式可以找到整个网址。