PHP允许img和anchors - 但排除其他标签

时间:2014-01-27 16:54:03

标签: php regex strip-tags

我有一个textarea,我的用户需要被允许发布链接,邮件和图像。

function autolink($message)
{
    $text = " " . $message;
    $text = preg_replace("#([\n ])([a-z]+?)://([a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)#i", "\\1<a href=\"\\2://\\3\" target=\"_blank\" class=\"link\">\\2://\\3</a>", $text);
    $text = preg_replace("#([\n ])www\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]*)?)#i", "\\1<a href=\"http://www.\\2.\\3\\4\" target=\"_blank\" class=\"link\">www.\\2.\\3\\4</a>", $text);
    $text = preg_replace("#([\n ])([a-z0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)?[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\" class=\"link\">\\2@\\3</a>", $text);

    $text = substr($text, 1);
    return($text);
}

这个功能就像一个魅力,但如果我想添加一个替换img src的行 - 它将不再有用。

$text = preg_replace('#<img.+?src="([^"]*)".*?/?>#i', '<a href="$1">$0</a>', $text);

以上效果非常好,但现在它不会将锚点和邮件替换为链接。

我搜索了这个论坛并找到了一个可能有效的答案,它包含了php函数strip_tags();

$allowed = "<img><a>";
$formatted = strip_tags($_POST['usercomment'], $allowed );

最安全(和正确)的解决方案是什么?我已经阅读了一些关于DOM和调节表达式不适合这项工作,但我真的需要帮助。 如果没有带img标记的行,当用户发布链接(http://example.com)并且可以点击它时,我的功能非常有效。

请原谅我英语不好和描述方式,这是我的第一篇文章。

1 个答案:

答案 0 :(得分:0)

为什么不删除所有内容,并让用户使用bbcode,我只是编写了这个函数来做类似的事情。

function html2txt($document){ 
`$search = array('@<script[^>]*?>.*?</script>@si',  // Strip out javascript 
           '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags 
           '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly 
           '@<![\s\S]*?--[ \t\n\r]*>@',         // Strip multi-line comments including CDATA 
           '@EMBED@siU',
           '@SRC@siU',
           '@allowScriptAccess@siU',
           '@allownetworking@siU',
           '/<.*?>/'
); 
$text = preg_replace($search, '', $document); 
return $text;
}

function display_bbcode($string){
    $search = 
    array(
    '~\[url(?|=[\'"]?+([^]"\']++)[\'"]?+]([^[]++)|](([^[]++)))\[/url]~', // URL
    '/\[b\](.*?)\[\/b\]/ms', // Bold
    '/\[i\](.*?)\[\/i\]/ms', // Italic
    '/\[u\](.*?)\[\/u\]/ms', // Underline
    '/\[img\](.*?)\[\/img\]/ms', //IMG
    '/\[size\="?(.*?)"?\](.*?)\[\/size\]/ms', //Font Size
    '/\[color\="?(.*?)"?\](.*?)\[\/color\]/ms', // Color
    '/\[quote](.*?)\[\/quote\]/ms', //Quote
    '/\[list\=(.*?)\](.*?)\[\/list\]/ms', //List 
    '/\[list\](.*?)\[\/list\]/ms', // Default List
    '/\[\*\]\s?(.*?)\n/ms'
); 
$replace = 
array(
'<a href="$1">$2</a>', // URL
    '<strong>\1</strong>', // Bold
    '<em>\1</em>', // Italic
    '<u>\1</u>', // Underline
    '<img src="\1" alt="\1" height=\'200px\' width=\'200px\'/>', //Image, Auto Re-size
    '<font size="\1%">\2</font>',// Font Size
    '<font color="\1">\2</font>', // Font Color
    '<blockquote>\1</blockquote>', //Qoute 
    '<ol start="\1">\2</ol>', // Some List Style?
    '<li>\1</li>',//Default List Style
    '<li>\1</li>'
    );
    $text = preg_replace($search, $replace, $string);
    return $text;
}

然后调用你的函数:

当用户发布内容时: strip_tags(html2txt($input));

显示内容时:     display_bbcode($output);