存档

文章标签 ‘过滤’

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(trim($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

分类: html总结, php学习 标签: , , , ,

android安卓手机禁止/过滤edittext输入表情

2015年1月15日 没有评论

如果你的android安卓手机需要给edittext禁止输入表情,或者输入后自动过滤,可以使用下面的类:

 

public class EmojiFilter {

//检测是否有emoji字符
public static boolean containsEmoji(String source) {
if (source.equals(null)) { return false; }
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (isEmojiCharacter(codePoint)) { return true; }
}
return false;
}

private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}

//过滤emoji 或者 其他非文字类型的字符
public static String filterEmoji(String source) {
//在传入的source后面加上一个空字符。返回的时候trim掉就OK了
source += ” “;
// 如果不包含,直接返回
if (!containsEmoji(source)) {
return source.trim();
}
else {
StringBuilder buf = null;
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (isEmojiCharacter(codePoint)) {
if (buf == null) {
buf = new StringBuilder(source.length());
}
buf.append(codePoint);
}
}
if (buf == null) {
//如果没有找到 emoji表情,则返回源字符串
return source;
}
else {
//这里的意义在于尽可能少的toString,因为会重新生成字符串
if (buf.length() == len) {
buf = null;
return source;
}
else {
return buf.toString();
}
}
}
}
}

 

调用方法很简单:

EmojiFilter.filterEmoji(String)

似乎高版本的手机适用,但是低版本的系统,仍然无法过滤部分表情。

分类: android 标签: , ,
css.php