php:細說PHP之文章發佈操作實例2

然後我們來看看,最核心的acticle_class.php怎麼運作。

<?php
	class Acticle {   //聲明一個文章類,其中有兩個成員屬性標題和內容,如果需要還可以更多	
		private $subject;        //文章的標題成員屬性
		private $message;       //文章的主本內容成員屬性
		
		//構造方法,通過傳入文章標題和文章主體和文章的操作選項數組創建文章對象
		function __construct($subject=" ",$message=" ", $parse=array()) {
			$this->subject=$this->html2Text($subject); //爲文章標題賦初值,將HTML標記轉爲實體
              
			if(!empty($parse)) {            //如果用戶選擇了對文章的操作選項則條件成功
				foreach($parse as $value) {  //用戶選擇了幾個文章操作選項則循環幾次
					switch($value) {      //根據用戶選擇的不同選項,調用不同的內部方法處理
						case 1:         //如果用戶選擇“刪除HTML標籤”選項時條件成立
							$message=$this->delHtmlTags($message);  
							break;
						case 2:        //如果選擇“轉換HTML標籤爲實體”選項時條件成立
							$message=$this->html2Text($message);
							break;	
						case 3:        //如果用戶選擇“使用UBB代碼”選項時條件成立
							$message=$this->UBBCode2Html($message);
							break;
						case 4:        //如果用戶選擇“開啓URL識別”選項時條件成立
							$message=$this->parseURL($message);
							break;
						case 5:        //如果用戶選擇“使用表情”選項時條件成立
							$message=$this->parseSmilies($message);
							break;
						case 6:        //如果用戶選擇“禁用非法關鍵字”選項時條件成立
							$message=$this->disableKeyWords($message);
							break;
						case 7:        //如果用戶選擇“PHP代碼設爲高亮”選項時條件成立
							$message=$this->prasePHPCode($message);
							break;
						case 8:        //如果用戶選擇“原樣顯示”選項時條件成立
							$message=$this->prasePer($message);
							break;
						case 9:        //如果用戶選擇“同步換行”選項時條件成立
							$message=$this->nltobr($message);
							break;
					}
				}	
			}
	
			$this->message=$message;         //給成員屬性$message賦初值,
		}
		
		private function delHtmlTags($message) {  //此私有方法有來刪除HTML標記
			return strip_tags($message);         //調用字符串處理函數刪除HTML標記
		}

		private function html2Text($message) {   //此私有方法有來將HTML標記轉爲HTML實體
			return htmlSpecialChars(stripSlashes($message));  //調用字符串處理函數進行操作
		}

		private function UBBCode2Html($message) {   //此私有方法有來解析UBB代碼
			$pattern=array('/\[b\]/i', '/\[\/b\]/i', '/\[i\]/i',   //聲明正則表達式的模板數組
			       	'/\[\/i\]/i', '/\[u\]/i', '/\[\/u\]/i',              
				'/\[font=([^\[\<]+?)\]/i',                        
				'/\[color=([#\w]+?)\]/i',                       
				'/\[size=(\d+?)\]/i',                            
				'/\[size=(\d+(\.\d+)?(px|pt|in|cm|mm|pc|em|ex|%)+?)\]/i',   
				'/\[align=(left|center|right)\]/i',                  
				'/\[url=www.([^\["\']+?)\](.+?)\[\/url\]/is',          
				'/\[url=(https?|ftp|gopher|news|telnet){1}:\/\/([^\["\']+?)\](.+?)\[\/url\]/is',
				'/\[email\]\s*([a-z0-9\-_.+]+)@([a-z0-9\-_]+[.][a-z0-9\-_.]+)\s*\[\/email\]/i', 
				'/\[email=([a-z0-9\-_.+]+)@([a-z0-9\-_]+[.][a-z0-9\-_.]+)\](.+?)\[\/email\]/is', 
				'/\[img\](.+?)\[\/img\]/',                      
				'/\[\/color\]/i', '/\[\/size\]/i', '/\[\/font\]/i','/\[\/align\]/'  
			);
    
			$replace=array('<b>', '</b>', '<i>',    //聲明正則表達式的替換數組
				'</i>', '<u>', '</u>',                     
				'<font face="\\1">',                           
				'<font color="\\1">',                         
				'<font size="\\1">',                          
				'<font style=\"font-size: \\1\">',                 
				'<p align="\\1">',                             
				'<a href="http://www.\\1" target="_blank">\\2</a>', 
				'<a href="\\1://\\2" target="_blank">\\3</a>',       
				'<a href="mailto:\\1@\\2">\\1@\\2</a>',          
				'<a href="mailto:\\1@\\2">\\3</a>',              
				'<img src="\\1">',                            
				'</font>', '</font>', '</font>', '</p>'             
			);
			return preg_replace($pattern, $replace, $message);  //調用正則表達式的替換函數
		}
		private function cuturl($url) {      //此私有方法用來剪切長的URL,並加上鍊接
			$length = 65;
			$urllink = "<a href=\"".(substr(strtolower($url), 0, 4) == 'www.' ? "http://$url" : $url).'" target="_blank">';
			if(strlen($url) > $length) {    //如果URL長度大於65則剪切
				$url = substr($url, 0, intval($length * 0.5)).' ... '.substr($url, - intval($length * 0.3));
			}
			$urllink .= $url.'</a>';
			return $urllink;
		}

		private function parseURL($message) {   //此私有方法用來解析URL,將其加上鍊接
$urlPattern="/(www.|https?:\/\/|ftp:\/\/|news:\/\/|telnet:\/\/){1}([^\[\"']+?)(com|net|org)(\/[\w-\.\/\?\%\&\=]*)?/ei"; 	
			return preg_replace($urlPattern, "\$this->cuturl('\\1\\2\\3\\4')", $message);
		}
	
		private function parseSmilies($message) {    //此方法用來解析表情
			$pattern=array('/:\)|\/wx|微笑/i',        //聲明表情的正則表達式模板數組
					'/:@|\/fn|發怒/i',
					'/:kiss|\/kill|\/sa|示愛/',
					'/:p|\/tx|偷笑/i',
					'/:q|\/dk|大哭/i' );
			$replace=array('<img src="smilies/smile.gif" alt="微笑">',  //聲明表情的替換數組
					'<img src="smilies/huffy.gif" alt="發怒">',
					'<img src="smilies/kiss.gif" alt="示愛">',
					'<img src="smilies/titter.gif" alt="偷笑">',
					'<img src="smilies/cry.gif" alt="大哭">');
			return preg_replace($pattern, $replace, $message);	     //調用正則表達式的替換函數
		}
		
		private function disableKeyWords($message) {   //此方法用來屏蔽文章中的非法關鍵字
			$keywords_disable=array("非法關鍵字一","非法關鍵字二","非法關鍵字三");
			return str_replace($keywords_disable,"**",$message);
		}

		private function prasePHPCode($message) {    //此方法用來將PHP代碼設置爲高亮
			$pattern='/(<\?.*?\?>)/ise';
			$replace='"<pre style=\"background:#ddd\">".highlight_string("\\1",true)."</pre>"';
			return preg_replace($pattern, $replace, $message);	
		}
			
		private function prasePer($message) {        //此方法用來將文章原樣輸出,即加上<pre>標記
			return '<pre>'.$message.'</pre>';
		}

		private function nltobr($message) {          //此私有方法用來將換行符號轉爲<br>標記
			return nl2br($message);              //調用字符串處理函數nl2br()
		}	

		public function getSubject() {             //此方法爲公有的,返回文章的標題
			return '<h1 align=center>'.$this->subject.'</h1>';
		}

		public function getMessage() {           //此方法爲公有的,返回文章的主體內容
			return $this->message;
		}
	}
?>
該類主要內容就是它的構造方法,遍歷parse數組裏面的每一項,對message做一次處理。

基本上都是直接調用php自帶的字符串的處理函數,還有問題就是利用正則表達式替換。

preg_replace($pattern, $replace, $message),第一個參數表示正則表達式模式數組,第二個參數表示將這個遇到正則表達式替換後的內容,也是數組,兩者應該是一一對應的。

正則表達式基本上就是/XXXXXX /yyy 以/... /表示分隔,yyy表示匹配參數 中間有|表示或,具體可以自己參考網上資料或者書。常常用在我們的用戶登錄上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章