extend.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // $Id$
  12. /**
  13. +------------------------------------------------------------------------------
  14. * Think扩展函数库 需要手动加载后调用或者放入项目函数库
  15. +------------------------------------------------------------------------------
  16. * @category Think
  17. * @package Common
  18. * @author liu21st <liu21st@gmail.com>
  19. * @version $Id$
  20. +------------------------------------------------------------------------------
  21. */
  22. // 获取客户端IP地址
  23. function get_client_ip(){
  24. if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
  25. $ip = getenv("HTTP_CLIENT_IP");
  26. else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
  27. $ip = getenv("HTTP_X_FORWARDED_FOR");
  28. else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
  29. $ip = getenv("REMOTE_ADDR");
  30. else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
  31. $ip = $_SERVER['REMOTE_ADDR'];
  32. else
  33. $ip = "unknown";
  34. return($ip);
  35. }
  36. /**
  37. +----------------------------------------------------------
  38. * 字符串截取,支持中文和其他编码
  39. +----------------------------------------------------------
  40. * @static
  41. * @access public
  42. +----------------------------------------------------------
  43. * @param string $str 需要转换的字符串
  44. * @param string $start 开始位置
  45. * @param string $length 截取长度
  46. * @param string $charset 编码格式
  47. * @param string $suffix 截断显示字符
  48. +----------------------------------------------------------
  49. * @return string
  50. +----------------------------------------------------------
  51. */
  52. function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
  53. {
  54. if(function_exists("mb_substr"))
  55. return mb_substr($str, $start, $length, $charset);
  56. elseif(function_exists('iconv_substr')) {
  57. return iconv_substr($str,$start,$length,$charset);
  58. }
  59. $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  60. $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  61. $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  62. $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  63. preg_match_all($re[$charset], $str, $match);
  64. $slice = join("",array_slice($match[0], $start, $length));
  65. if($suffix) return $slice."…";
  66. return $slice;
  67. }
  68. /**
  69. +----------------------------------------------------------
  70. * 产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合
  71. +----------------------------------------------------------
  72. * @param string $len 长度
  73. * @param string $type 字串类型
  74. * 0 字母 1 数字 其它 混合
  75. * @param string $addChars 额外字符
  76. +----------------------------------------------------------
  77. * @return string
  78. +----------------------------------------------------------
  79. */
  80. function rand_string($len=6,$type='',$addChars='') {
  81. $str ='';
  82. switch($type) {
  83. case 0:
  84. $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.$addChars;
  85. break;
  86. case 1:
  87. $chars= str_repeat('0123456789',3);
  88. break;
  89. case 2:
  90. $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.$addChars;
  91. break;
  92. case 3:
  93. $chars='abcdefghijklmnopqrstuvwxyz'.$addChars;
  94. break;
  95. case 4:
  96. $chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借".$addChars;
  97. break;
  98. default :
  99. // 默认去掉了容易混淆的字符oOLl和数字01,要添加请使用addChars参数
  100. $chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars;
  101. break;
  102. }
  103. if($len>10 ) {//位数过长重复字符串一定次数
  104. $chars= $type==1? str_repeat($chars,$len) : str_repeat($chars,5);
  105. }
  106. if($type!=4) {
  107. $chars = str_shuffle($chars);
  108. $str = substr($chars,0,$len);
  109. }else{
  110. // 中文随机字
  111. for($i=0;$i<$len;$i++){
  112. $str.= msubstr($chars, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),1);
  113. }
  114. }
  115. return $str;
  116. }
  117. /**
  118. +----------------------------------------------------------
  119. * 获取登录验证码 默认为4位数字
  120. +----------------------------------------------------------
  121. * @param string $fmode 文件名
  122. +----------------------------------------------------------
  123. * @return string
  124. +----------------------------------------------------------
  125. */
  126. function build_verify ($length=4,$mode=1) {
  127. return rand_string($length,$mode);
  128. }
  129. /**
  130. +----------------------------------------------------------
  131. * 字节格式化 把字节数格式为 B K M G T 描述的大小
  132. +----------------------------------------------------------
  133. * @return string
  134. +----------------------------------------------------------
  135. */
  136. function byte_format($size, $dec=2)
  137. {
  138. $a = array("B", "KB", "MB", "GB", "TB", "PB");
  139. $pos = 0;
  140. while ($size >= 1024) {
  141. $size /= 1024;
  142. $pos++;
  143. }
  144. return round($size,$dec)." ".$a[$pos];
  145. }
  146. /**
  147. +----------------------------------------------------------
  148. * 检查字符串是否是UTF8编码
  149. +----------------------------------------------------------
  150. * @param string $string 字符串
  151. +----------------------------------------------------------
  152. * @return Boolean
  153. +----------------------------------------------------------
  154. */
  155. function is_utf8($string)
  156. {
  157. return preg_match('%^(?:
  158. [\x09\x0A\x0D\x20-\x7E] # ASCII
  159. | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
  160. | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
  161. | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
  162. | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
  163. | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
  164. | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
  165. | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
  166. )*$%xs', $string);
  167. }
  168. /**
  169. +----------------------------------------------------------
  170. * 代码加亮
  171. +----------------------------------------------------------
  172. * @param String $str 要高亮显示的字符串 或者 文件名
  173. * @param Boolean $show 是否输出
  174. +----------------------------------------------------------
  175. * @return String
  176. +----------------------------------------------------------
  177. */
  178. function highlight_code($str,$show=false)
  179. {
  180. if(file_exists($str)) {
  181. $str = file_get_contents($str);
  182. }
  183. $str = stripslashes(trim($str));
  184. // The highlight string function encodes and highlights
  185. // brackets so we need them to start raw
  186. $str = str_replace(array('&lt;', '&gt;'), array('<', '>'), $str);
  187. // Replace any existing PHP tags to temporary markers so they don't accidentally
  188. // break the string out of PHP, and thus, thwart the highlighting.
  189. $str = str_replace(array('&lt;?php', '?&gt;', '\\'), array('phptagopen', 'phptagclose', 'backslashtmp'), $str);
  190. // The highlight_string function requires that the text be surrounded
  191. // by PHP tags. Since we don't know if A) the submitted text has PHP tags,
  192. // or B) whether the PHP tags enclose the entire string, we will add our
  193. // own PHP tags around the string along with some markers to make replacement easier later
  194. $str = '<?php //tempstart'."\n".$str.'//tempend ?>'; // <?
  195. // All the magic happens here, baby!
  196. $str = highlight_string($str, TRUE);
  197. // Prior to PHP 5, the highlight function used icky font tags
  198. // so we'll replace them with span tags.
  199. if (abs(phpversion()) < 5)
  200. {
  201. $str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str);
  202. $str = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);
  203. }
  204. // Remove our artificially added PHP
  205. $str = preg_replace("#\<code\>.+?//tempstart\<br />\</span\>#is", "<code>\n", $str);
  206. $str = preg_replace("#\<code\>.+?//tempstart\<br />#is", "<code>\n", $str);
  207. $str = preg_replace("#//tempend.+#is", "</span>\n</code>", $str);
  208. // Replace our markers back to PHP tags.
  209. $str = str_replace(array('phptagopen', 'phptagclose', 'backslashtmp'), array('&lt;?php', '?&gt;', '\\'), $str); //<?
  210. $line = explode("<br />", rtrim(ltrim($str,'<code>'),'</code>'));
  211. $result = '<div class="code"><ol>';
  212. foreach($line as $key=>$val) {
  213. $result .= '<li>'.$val.'</li>';
  214. }
  215. $result .= '</ol></div>';
  216. $result = str_replace("\n", "", $result);
  217. if( $show!== false) {
  218. echo($result);
  219. }else {
  220. return $result;
  221. }
  222. }
  223. //输出安全的html
  224. function h($text, $tags = null){
  225. $text = trim($text);
  226. //完全过滤注释
  227. $text = preg_replace('/<!--?.*-->/','',$text);
  228. //完全过滤动态代码
  229. $text = preg_replace('/<\?|\?'.'>/','',$text);
  230. //完全过滤js
  231. $text = preg_replace('/<script?.*\/script>/','',$text);
  232. $text = str_replace('[','&#091;',$text);
  233. $text = str_replace(']','&#093;',$text);
  234. $text = str_replace('|','&#124;',$text);
  235. //过滤换行符
  236. $text = preg_replace('/\r?\n/','',$text);
  237. //br
  238. $text = preg_replace('/<br(\s\/)?'.'>/i','[br]',$text);
  239. $text = preg_replace('/(\[br\]\s*){10,}/i','[br]',$text);
  240. //过滤危险的属性,如:过滤on事件lang js
  241. while(preg_match('/(<[^><]+)( lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat)){
  242. $text=str_replace($mat[0],$mat[1],$text);
  243. }
  244. while(preg_match('/(<[^><]+)(window\.|javascript:|js:|about:|file:|document\.|vbs:|cookie)([^><]*)/i',$text,$mat)){
  245. $text=str_replace($mat[0],$mat[1].$mat[3],$text);
  246. }
  247. if(empty($tags)) {
  248. $tags = 'table|td|th|tr|i|b|u|strong|img|p|br|div|strong|em|ul|ol|li|dl|dd|dt|a';
  249. }
  250. //允许的HTML标签
  251. $text = preg_replace('/<('.$tags.')( [^><\[\]]*)>/i','[\1\2]',$text);
  252. //过滤多余html
  253. $text = preg_replace('/<\/?(html|head|meta|link|base|basefont|body|bgsound|title|style|script|form|iframe|frame|frameset|applet|id|ilayer|layer|name|script|style|xml)[^><]*>/i','',$text);
  254. //过滤合法的html标签
  255. while(preg_match('/<([a-z]+)[^><\[\]]*>[^><]*<\/\1>/i',$text,$mat)){
  256. $text=str_replace($mat[0],str_replace('>',']',str_replace('<','[',$mat[0])),$text);
  257. }
  258. //转换引号
  259. while(preg_match('/(\[[^\[\]]*=\s*)(\"|\')([^\2=\[\]]+)\2([^\[\]]*\])/i',$text,$mat)){
  260. $text=str_replace($mat[0],$mat[1].'|'.$mat[3].'|'.$mat[4],$text);
  261. }
  262. //过滤错误的单个引号
  263. while(preg_match('/\[[^\[\]]*(\"|\')[^\[\]]*\]/i',$text,$mat)){
  264. $text=str_replace($mat[0],str_replace($mat[1],'',$mat[0]),$text);
  265. }
  266. //转换其它所有不合法的 < >
  267. $text = str_replace('<','&lt;',$text);
  268. $text = str_replace('>','&gt;',$text);
  269. $text = str_replace('"','&quot;',$text);
  270. //反转换
  271. $text = str_replace('[','<',$text);
  272. $text = str_replace(']','>',$text);
  273. $text = str_replace('|','"',$text);
  274. //过滤多余空格
  275. $text = str_replace(' ',' ',$text);
  276. return $text;
  277. }
  278. function ubb($Text) {
  279. $Text=trim($Text);
  280. //$Text=htmlspecialchars($Text);
  281. $Text=preg_replace("/\\t/is"," ",$Text);
  282. $Text=preg_replace("/\[h1\](.+?)\[\/h1\]/is","<h1>\\1</h1>",$Text);
  283. $Text=preg_replace("/\[h2\](.+?)\[\/h2\]/is","<h2>\\1</h2>",$Text);
  284. $Text=preg_replace("/\[h3\](.+?)\[\/h3\]/is","<h3>\\1</h3>",$Text);
  285. $Text=preg_replace("/\[h4\](.+?)\[\/h4\]/is","<h4>\\1</h4>",$Text);
  286. $Text=preg_replace("/\[h5\](.+?)\[\/h5\]/is","<h5>\\1</h5>",$Text);
  287. $Text=preg_replace("/\[h6\](.+?)\[\/h6\]/is","<h6>\\1</h6>",$Text);
  288. $Text=preg_replace("/\[separator\]/is","",$Text);
  289. $Text=preg_replace("/\[center\](.+?)\[\/center\]/is","<center>\\1</center>",$Text);
  290. $Text=preg_replace("/\[url=http:\/\/([^\[]*)\](.+?)\[\/url\]/is","<a href=\"http://\\1\" target=_blank>\\2</a>",$Text);
  291. $Text=preg_replace("/\[url=([^\[]*)\](.+?)\[\/url\]/is","<a href=\"http://\\1\" target=_blank>\\2</a>",$Text);
  292. $Text=preg_replace("/\[url\]http:\/\/([^\[]*)\[\/url\]/is","<a href=\"http://\\1\" target=_blank>\\1</a>",$Text);
  293. $Text=preg_replace("/\[url\]([^\[]*)\[\/url\]/is","<a href=\"\\1\" target=_blank>\\1</a>",$Text);
  294. $Text=preg_replace("/\[img\](.+?)\[\/img\]/is","<img src=\\1>",$Text);
  295. $Text=preg_replace("/\[color=(.+?)\](.+?)\[\/color\]/is","<font color=\\1>\\2</font>",$Text);
  296. $Text=preg_replace("/\[size=(.+?)\](.+?)\[\/size\]/is","<font size=\\1>\\2</font>",$Text);
  297. $Text=preg_replace("/\[sup\](.+?)\[\/sup\]/is","<sup>\\1</sup>",$Text);
  298. $Text=preg_replace("/\[sub\](.+?)\[\/sub\]/is","<sub>\\1</sub>",$Text);
  299. $Text=preg_replace("/\[pre\](.+?)\[\/pre\]/is","<pre>\\1</pre>",$Text);
  300. $Text=preg_replace("/\[email\](.+?)\[\/email\]/is","<a href='mailto:\\1'>\\1</a>",$Text);
  301. $Text=preg_replace("/\[colorTxt\](.+?)\[\/colorTxt\]/eis","color_txt('\\1')",$Text);
  302. $Text=preg_replace("/\[emot\](.+?)\[\/emot\]/eis","emot('\\1')",$Text);
  303. $Text=preg_replace("/\[i\](.+?)\[\/i\]/is","<i>\\1</i>",$Text);
  304. $Text=preg_replace("/\[u\](.+?)\[\/u\]/is","<u>\\1</u>",$Text);
  305. $Text=preg_replace("/\[b\](.+?)\[\/b\]/is","<b>\\1</b>",$Text);
  306. $Text=preg_replace("/\[quote\](.+?)\[\/quote\]/is"," <div class='quote'><h5>引用:</h5><blockquote>\\1</blockquote></div>", $Text);
  307. $Text=preg_replace("/\[code\](.+?)\[\/code\]/eis","highlight_code('\\1')", $Text);
  308. $Text=preg_replace("/\[php\](.+?)\[\/php\]/eis","highlight_code('\\1')", $Text);
  309. $Text=preg_replace("/\[sig\](.+?)\[\/sig\]/is","<div class='sign'>\\1</div>", $Text);
  310. $Text=preg_replace("/\\n/is","<br/>",$Text);
  311. return $Text;
  312. }
  313. // 随机生成一组字符串
  314. function build_count_rand ($number,$length=4,$mode=1) {
  315. if($mode==1 && $length<strlen($number) ) {
  316. //不足以生成一定数量的不重复数字
  317. return false;
  318. }
  319. $rand = array();
  320. for($i=0; $i<$number; $i++) {
  321. $rand[] = rand_string($length,$mode);
  322. }
  323. $unqiue = array_unique($rand);
  324. if(count($unqiue)==count($rand)) {
  325. return $rand;
  326. }
  327. $count = count($rand)-count($unqiue);
  328. for($i=0; $i<$count*3; $i++) {
  329. $rand[] = rand_string($length,$mode);
  330. }
  331. $rand = array_slice(array_unique ($rand),0,$number);
  332. return $rand;
  333. }
  334. function remove_xss($val) {
  335. // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
  336. // this prevents some character re-spacing such as <java\0script>
  337. // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
  338. $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
  339. // straight replacements, the user should never need these since they're normal characters
  340. // this prevents like <IMG SRC=@avascript:alert('XSS')>
  341. $search = 'abcdefghijklmnopqrstuvwxyz';
  342. $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  343. $search .= '1234567890!@#$%^&*()';
  344. $search .= '~`";:?+/={}[]-_|\'\\';
  345. for ($i = 0; $i < strlen($search); $i++) {
  346. // ;? matches the ;, which is optional
  347. // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
  348. // @ @ search for the hex values
  349. $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
  350. // @ @ 0{0,7} matches '0' zero to seven times
  351. $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
  352. }
  353. // now the only remaining whitespace attacks are \t, \n, and \r
  354. $ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
  355. $ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
  356. $ra = array_merge($ra1, $ra2);
  357. $found = true; // keep replacing as long as the previous round replaced something
  358. while ($found == true) {
  359. $val_before = $val;
  360. for ($i = 0; $i < sizeof($ra); $i++) {
  361. $pattern = '/';
  362. for ($j = 0; $j < strlen($ra[$i]); $j++) {
  363. if ($j > 0) {
  364. $pattern .= '(';
  365. $pattern .= '(&#[xX]0{0,8}([9ab]);)';
  366. $pattern .= '|';
  367. $pattern .= '|(&#0{0,8}([9|10|13]);)';
  368. $pattern .= ')*';
  369. }
  370. $pattern .= $ra[$i][$j];
  371. }
  372. $pattern .= '/i';
  373. $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
  374. $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
  375. if ($val_before == $val) {
  376. // no replacements were made, so exit the loop
  377. $found = false;
  378. }
  379. }
  380. }
  381. return $val;
  382. }
  383. /**
  384. +----------------------------------------------------------
  385. * 把返回的数据集转换成Tree
  386. +----------------------------------------------------------
  387. * @access public
  388. +----------------------------------------------------------
  389. * @param array $list 要转换的数据集
  390. * @param string $pid parent标记字段
  391. * @param string $level level标记字段
  392. +----------------------------------------------------------
  393. * @return array
  394. +----------------------------------------------------------
  395. */
  396. function list_to_tree($list, $pk='id',$pid = 'pid',$child = '_child',$root=0)
  397. {
  398. // 创建Tree
  399. $tree = array();
  400. if(is_array($list)) {
  401. // 创建基于主键的数组引用
  402. $refer = array();
  403. foreach ($list as $key => $data) {
  404. $refer[$data[$pk]] =& $list[$key];
  405. }
  406. foreach ($list as $key => $data) {
  407. // 判断是否存在parent
  408. $parentId = $data[$pid];
  409. if ($root == $parentId) {
  410. $tree[] =& $list[$key];
  411. }else{
  412. if (isset($refer[$parentId])) {
  413. $parent =& $refer[$parentId];
  414. $parent[$child][] =& $list[$key];
  415. }
  416. }
  417. }
  418. }
  419. return $tree;
  420. }
  421. /**
  422. +----------------------------------------------------------
  423. * 对查询结果集进行排序
  424. +----------------------------------------------------------
  425. * @access public
  426. +----------------------------------------------------------
  427. * @param array $list 查询结果
  428. * @param string $field 排序的字段名
  429. * @param array $sortby 排序类型
  430. * asc正向排序 desc逆向排序 nat自然排序
  431. +----------------------------------------------------------
  432. * @return array
  433. +----------------------------------------------------------
  434. */
  435. function list_sort_by($list,$field, $sortby='asc') {
  436. if(is_array($list)){
  437. $refer = $resultSet = array();
  438. foreach ($list as $i => $data)
  439. $refer[$i] = &$data[$field];
  440. switch ($sortby) {
  441. case 'asc': // 正向排序
  442. asort($refer);
  443. break;
  444. case 'desc':// 逆向排序
  445. arsort($refer);
  446. break;
  447. case 'nat': // 自然排序
  448. natcasesort($refer);
  449. break;
  450. }
  451. foreach ( $refer as $key=> $val)
  452. $resultSet[] = &$list[$key];
  453. return $resultSet;
  454. }
  455. return false;
  456. }
  457. /**
  458. +----------------------------------------------------------
  459. * 在数据列表中搜索
  460. +----------------------------------------------------------
  461. * @access public
  462. +----------------------------------------------------------
  463. * @param array $list 数据列表
  464. * @param mixed $condition 查询条件
  465. * 支持 array('name'=>$value) 或者 name=$value
  466. +----------------------------------------------------------
  467. * @return array
  468. +----------------------------------------------------------
  469. */
  470. function list_search($list,$condition) {
  471. if(is_string($condition))
  472. parse_str($condition,$condition);
  473. // 返回的结果集合
  474. $resultSet = array();
  475. foreach ($list as $key=>$data){
  476. $find = false;
  477. foreach ($condition as $field=>$value){
  478. if(isset($data[$field])) {
  479. if(0 === strpos($value,'/')) {
  480. $find = preg_match($value,$data[$field]);
  481. }elseif($data[$field]==$value){
  482. $find = true;
  483. }
  484. }
  485. }
  486. if($find)
  487. $resultSet[] = &$list[$key];
  488. }
  489. return $resultSet;
  490. }
  491. // 发送Http状态信息
  492. function send_http_status($status) {
  493. static $_status = array(
  494. // Informational 1xx
  495. 100 => 'Continue',
  496. 101 => 'Switching Protocols',
  497. // Success 2xx
  498. 200 => 'OK',
  499. 201 => 'Created',
  500. 202 => 'Accepted',
  501. 203 => 'Non-Authoritative Information',
  502. 204 => 'No Content',
  503. 205 => 'Reset Content',
  504. 206 => 'Partial Content',
  505. // Redirection 3xx
  506. 300 => 'Multiple Choices',
  507. 301 => 'Moved Permanently',
  508. 302 => 'Moved Temporarily ', // 1.1
  509. 303 => 'See Other',
  510. 304 => 'Not Modified',
  511. 305 => 'Use Proxy',
  512. // 306 is deprecated but reserved
  513. 307 => 'Temporary Redirect',
  514. // Client Error 4xx
  515. 400 => 'Bad Request',
  516. 401 => 'Unauthorized',
  517. 402 => 'Payment Required',
  518. 403 => 'Forbidden',
  519. 404 => 'Not Found',
  520. 405 => 'Method Not Allowed',
  521. 406 => 'Not Acceptable',
  522. 407 => 'Proxy Authentication Required',
  523. 408 => 'Request Timeout',
  524. 409 => 'Conflict',
  525. 410 => 'Gone',
  526. 411 => 'Length Required',
  527. 412 => 'Precondition Failed',
  528. 413 => 'Request Entity Too Large',
  529. 414 => 'Request-URI Too Long',
  530. 415 => 'Unsupported Media Type',
  531. 416 => 'Requested Range Not Satisfiable',
  532. 417 => 'Expectation Failed',
  533. // Server Error 5xx
  534. 500 => 'Internal Server Error',
  535. 501 => 'Not Implemented',
  536. 502 => 'Bad Gateway',
  537. 503 => 'Service Unavailable',
  538. 504 => 'Gateway Timeout',
  539. 505 => 'HTTP Version Not Supported',
  540. 509 => 'Bandwidth Limit Exceeded'
  541. );
  542. if(array_key_exists($code,$_status)) {
  543. header('HTTP/1.1 '.$code.' '.$_status[$code]);
  544. }
  545. }
  546. ?>