1. /**
    2. * 把html标签转化成非html格式
    3. * 通常用于从表单中post上来的需要消除html
    4. *
    5. * @param string or array $data
    6. * @return string or array
    7. */
    8. function html($data)
    9. {
    10. $magic_quotes=get_magic_quotes_gpc();
    11. if(is_array($data))
    12. {
    13. foreach($data as $k=>$v)
    14. $data[$k]=html($v);
    15. }
    16. else
    17. {
    18. $data=trim($data);
    19. $data=strip_tags($data); //除去字符串中的HTML和PHP标签
    20. //转义_ %
    21. //$data = str_replace("_", "\_", $data);
    22. //$data = str_replace("%", "\%", $data);
    23. $data=htmlspecialchars($data,ENT_QUOTES); //转换特殊HTML字符编码为字符
    24. if(!$magic_quotes) $data=addslashes($data);
    25. $data=discuz_checkhtml($data);
    26. }
    27. return $data;
    28. }
    29. function discuz_checkhtml($html) {
    30. preg_match_all("/\<([^\<]+)\>/is", $html, $ms);
    31. $searchs[] = '<';
    32. $replaces[] = '&lt;';
    33. $searchs[] = '>';
    34. $replaces[] = '&gt;';
    35. if($ms[1]) {
    36. $allowtags = 'img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote|object|param';
    37. $ms[1] = array_unique($ms[1]);
    38. foreach ($ms[1] as $value) {
    39. $searchs[] = "&lt;".$value."&gt;";
    40. $value = str_replace('&', '_uch_tmp_str_', $value);
    41. $value = dhtmlspecialchars($value);
    42. $value = str_replace('_uch_tmp_str_', '&', $value);
    43. $value = str_replace(array('\\','/*'), array('.','/.'), $value);
    44. $skipkeys = array('onabort','onactivate','onafterprint','onafterupdate','onbeforeactivate','onbeforecopy','onbeforecut','onbeforedeactivate',
    45. 'onbeforeeditfocus','onbeforepaste','onbeforeprint','onbeforeunload','onbeforeupdate','onblur','onbounce','oncellchange','onchange',
    46. 'onclick','oncontextmenu','oncontrolselect','oncopy','oncut','ondataavailable','ondatasetchanged','ondatasetcomplete','ondblclick',
    47. 'ondeactivate','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onerror','onerrorupdate',
    48. 'onfilterchange','onfinish','onfocus','onfocusin','onfocusout','onhelp','onkeydown','onkeypress','onkeyup','onlayoutcomplete',
    49. 'onload','onlosecapture','onmousedown','onmouseenter','onmouseleave','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel',
    50. 'onmove','onmoveend','onmovestart','onpaste','onpropertychange','onreadystatechange','onreset','onresize','onresizeend','onresizestart',
    51. 'onrowenter','onrowexit','onrowsdelete','onrowsinserted','onscroll','onselect','onselectionchange','onselectstart','onstart','onstop',
    52. 'onsubmit','onunload','javascript','script','eval','behaviour','expression','style','class');
    53. $skipstr = implode('|', $skipkeys);
    54. $value = preg_replace(array("/($skipstr)/i"), '.', $value);
    55. if(!preg_match("/^[\/|\s]?($allowtags)(\s+|$)/is", $value)) {
    56. $value = '';
    57. }
    58. $replaces[] = empty($value)?'':"<".str_replace('&quot;', '"', $value).">";
    59. }
    60. }
    61. $html = str_replace($searchs, $replaces, $html);
    62. return $html;
    63. }
    64. /**
    65. * 把hmlt标签转化成实体格式
    66. * 参数可以为数组或者字符串
    67. * @param mix $string
    68. * @return mix
    69. */
    70. function dhtmlspecialchars($string) {
    71. if(is_array($string)) {
    72. foreach($string as $key => $val) {
    73. $string[$key] = dhtmlspecialchars($val);
    74. }
    75. } else {
    76. $string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',
    77. str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string));
    78. }
    79. return $string;
    80. }