我有一个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)并且可以点击它时,我的功能非常有效。
请原谅我英语不好和描述方式,这是我的第一篇文章。
答案 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);