php自定义的magicStr过滤类
2020年11月2日
<?php
//使用说明:http://www.zhanghongliang.com/article/1507
class magicStr{
//入库操作
function encode($str,$inputType='text'){
if($inputType=='text'){
//此种类型应该过滤换行符,再去左右空格(建议过滤nl换行,不过滤也不影响)
return trim(str_replace(array("\\r\\n","\\r","\\n"),'',str_replace(array("\r\n","\r","\n"),'',$str)));
}
else if($inputType=='textarea'){return $str;}
else if($inputType=='editor'){return $str;}
else {return '';}
}
//pc+h5端返回处理函数
function decode($str,$inputType='text'){
if($inputType=='text'){return htmlspecialchars($str,ENT_QUOTES);}
else if($inputType=='in_text'){return htmlspecialchars($str,ENT_QUOTES);}
else if($inputType=='textarea'){return nl2br(htmlspecialchars($str,ENT_QUOTES));}
else if($inputType=='in_textarea'){return htmlspecialchars($str,ENT_QUOTES);}
else if($inputType=='editor'){return $this->replaceLabel($this->removeScript($str));}
else if($inputType=='in_editor'){
//kindeditor要求必须是转为实体之后的赋值,也可以增加$this->removeScript($str),因为只要前台过滤即可
return htmlspecialchars($str,ENT_QUOTES);
}
else if($inputType=='meta_title'){
//当输出到meta中的title的时候,不建议使用textarea或者editor内容,只建议用input type="text"这种输入框
return htmlspecialchars($str,ENT_QUOTES);
}
else if($inputType=='meta_keywords'){return htmlspecialchars($this->compress_html($str),ENT_QUOTES);}
else if($inputType=='meta_description'){return mb_substr(htmlspecialchars($this->compress_html($str),ENT_QUOTES),0,210);}
else {return '';}
}
//app端返回处理函数(在需要php处理的情况下)
//$withHtmlBody为是否app端拼接了标准的html头和尾标签:<!doctype html><html><head><meta charset="utf-8"><title>标题</title></head><body>$str</body></html>
function decodeApp($str,$inputType='text',$withHtmlBody=true){
if($inputType=='text'){return $str;}
else if($inputType=='in_text'){return $str;}
else if($inputType=='textarea'){
//如果app端拼接html头和尾则应该转义后返回(我们的项目实际上都拼了),否则可以直接返回
if($withHtmlBody===true){return htmlspecialchars($str,ENT_QUOTES);}
else {return $str;}
}
else if($inputType=='in_textarea'){return $str;}
else if($inputType=='editor'){return preg_replace('/<br\\s*?\/??>/i','',$this->replaceLabel($this->removeScript($str)));}
else if($inputType=='in_editor'){return 'app不允许富文本编辑';}
else {return '';}
}
//小程序端返回处理函数(在需要php处理的情况下)
function decodeWeixin($str,$inputType='text'){
if($inputType=='text'){return $str;}
else if($inputType=='in_text'){return $str;}
else if($inputType=='textarea'){return $str;}
else if($inputType=='in_textarea'){return $str;}
else if($inputType=='editor'){
//经过测试,微信小程序端只有editor类型需要处理,其他类型直接返回即可
//经过测试,小程序端和app端不一样,小程序端不需要和removeScript,但是要做下方处理:
return $this->replaceLabel(htmlspecialchars_decode(preg_replace('/<br\\s*?\/??>/i','',$str),ENT_QUOTES));
}
else if($inputType=='in_editor'){return 'weixin不允许富文本编辑';}
else {return '';}
}
//替换指定的html标签(富文本编辑器修改了插入标签之后的代码,显示的时候需要替换正确)
function replaceLabel($str){
return preg_replace('/(\[)(embed.*?)(\/\])/is','<$2>',preg_replace('/\]\[\/iframe\]/is','></iframe>',preg_replace('/\[iframe/is','<iframe',$str)));
//也可以是<$2/>表示用单标签结尾
}
//压缩html
function compress_html($string) {
return trim(preg_replace(array("/> *([^ ]*) *</","/<!--[^!]*-->/","'/\*[^*]*\*/'","/\r\n/","/\n/","/\t/",'/>[ ]+</'),array(">\\1<",'','','','','','><'),$string));
}
//过滤一些script标签和代码
function removeScript($str=''){
return preg_replace(array(
"/(java|vb)script/i",
"/href *= *[\s\S]*script *:/si",
//过滤字符串中的on***=,(onclick,onchange,onblur等等等)事件,忽略大小写(i),特殊字符圆点,中包含换行符 \n(s)
"/on([a-z]+)\s*=/si",
//不用preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si",'',$str);的原因是比如<iframe src="https://www.a.com">会无法过滤,但是前段可以正常显示
//同样会过滤frameset
"/<(\/?i?frame.*?)>/si",
"/<(\/?object.*?)>/si",//道理同上方的iframe过滤
"/<(\/?embed.*?)>/si",//道理同上方的iframe过滤
//过滤所有<script(任意字符)>(任意字符)</script(任意字符)>结尾的标签字符 和前条过滤script标签重合
//不用preg_replace("/<(\/?script.*)>/si",'',$str);是因为</script>不闭合的话,前段无法执行
"/<(script.*?)>(.*?)<(\/script.*?)>/si",
//使用preg_replace("/<(\/?head.*?|\/?title.*?|meta.*?|link.*?)>/si",'',$str);可以保留中间的内容
//使用下方的会过滤中间的内容
"'<head[^>]*?>.*?</head>'is",
"'<title[^>]*?>.*?</title>'is",
"'<meta[^>]*?>'is",
"'<link[^>]*?>'is"
),'',$str);
}
//ajax返回处理函数(ajax建议用前端magicStr.js处理,节省php资源)
/*
function decodeAjax($str,$inputType='text'){
if($inputType=='text'){return htmlspecialchars($str,ENT_QUOTES);}
else if($inputType=='in_text'){return $str;}
else if($inputType=='textarea'){return nl2br(htmlspecialchars($str,ENT_QUOTES));}
else if($inputType=='in_textarea'){
return $str;//和decode()不一样,ajax直接返回即可,因为前端是.val赋值
}
else if($inputType=='editor'){return $this->replaceLabel($this->removeScript($str));}
else if($inputType=='in_editor'){
//和decode()不一样,ajax直接返回即可,因为前端是.val赋值
//编辑器输出的时候,其实可以不用走$inputType=='editor'中的$this->removeScript($str),因为只要前台过滤即可
return $str;
}
else if($inputType=='meta_title'){return htmlspecialchars($str,ENT_QUOTES);}
else {return '';}
}
*/
}
具体请参照文件:magicStr.rar
近期评论