1. 程式人生 > >Discuz!開發之字串處理函式dhtmlspecialchars介紹

Discuz!開發之字串處理函式dhtmlspecialchars介紹

dhtmlspecialchars定義於Discuz!核心函式庫:\source\function\function_core.php,程式碼邏輯如下:

function dhtmlspecialchars($string, $flags = null) {
	if(is_array($string)) {
		foreach($string as $key => $val) {
			$string[$key] = dhtmlspecialchars($val, $flags);
		}
	} else {
		if($flags === null) {
			$string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);
			if(strpos($string, '&#') !== false) {
				$string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string);
			}
		} else {
			if(PHP_VERSION < '5.4.0') {
				$string = htmlspecialchars($string, $flags);
			} else {
				if(strtolower(CHARSET) == 'utf-8') {
					$charset = 'UTF-8';
				} else {
					$charset = 'ISO-8859-1';
				}
				$string = htmlspecialchars($string, $flags, $charset);
			}
		}
	}
	return $string;
}

dhtmlspecialchars實際上是對PHP內建函式htmlspecialchars的二次封裝和補充,使得不僅可以處理字串還可以遞迴處理陣列;

它的作用是是可以把一個數組或字串中的字元轉化為html實體,可以防止頁面的跨站問題,那麼我們看到他的轉換就是將‘&’,‘”’,‘<’,‘>’轉化為'&amp;', '&quot;', '&lt;', '&gt;'。但是這裡面會有一些問題,如‘& #x5FD7;’這樣的16進位制的html字元,為了防止這樣的字元被錯誤轉譯,所以又使用了正則進行匹配,把這樣的字元又轉換回來;一般使用在內容輸出到介面之前處理要輸出的內容;