Regexp与'&' char使用preg_replace

时间:2015-09-06 07:46:44

标签: php html regex preg-replace

我正在尝试使用&解析包含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将&转换为"&amp;",因此我的正则表达式会产生错误的结果。实际上,使用以下URL。

http://www.siteduzero.com/index.php?page=3&skin=blue

我获得;

<a href="https://openclassrooms.com/index.php?page=3&amp" target="_blank">https://openclassrooms.com/index.php?page=3&amp</a>;skin=blue

1 个答案:

答案 0 :(得分:1)

您可以添加&#34;;&#34;在你的正则表达式匹配的字符列表中,如下所示:

$content = preg_replace('#https?://[a-z0-9._/\?=&;-]+#i', '<a href="$0" target="_blank">$0</a>', $content);

这样,htmlspecialchars会在"&"中转换"&amp;"个字符,但您的正则表达式可以找到整个网址。