php:细说PHP之文章发布操作实例

首先,进的事post.PHP这个文件
  1. <form method="post" action="viewthread.php" target="_blank">  
  2.     <h2 align="center">发表文章演示</h2>  
  3.             <!-- 下面定义一组选项,使用样式表将其入在左边 -->  
  4.         <div style="width:200; float:left">  
  5.             <h5>选项</h5>  
  6.             <ul style="list-style:none;margin:0px;padding:0px">  
  7.                 <li><input type="checkbox" name="parse[]" value="1"> 删除HTML标签</li>  
  8.                 <li><input type="checkbox" name="parse[]" value="2"> 转换HTML标签为实体</li>  
  9.                 <li><input type="checkbox" name="parse[]" value="3"> 使用UBB代码</li>  
  10.                 <li><input type="checkbox" name="parse[]" value="4"> 开启URL识别</li>  
  11.                 <li title="可用的表情:  
  12. 【:), /wx, 微笑】【:@, /fn, 发怒】  
  13. 【:kiss, /kill,/sa,示爱】  
  14. 【:p, /tx, 偷笑】【:q, /dk, 大哭】"><input type="checkbox" name="parse[]" value="5"> 使用表情</li>  
  15.                 <li><input type="checkbox" name="parse[]" value="6"> 禁用非法关键字</li>  
  16.                 <li><input type="checkbox" name="parse[]" value="7"> PHP代码设为高亮</li>  
  17.                 <li><input type="checkbox" name="parse[]" value="8"> 原样显示</li>  
  18.                 <li><input type="checkbox" name="parse[]" value="9"> 同步换行</li>  
  19.             </ul>   <pre name="code" class="php"><?php  
  20.     require "acticle_class.php";    //包含脚本文件acticle_class.php,将文章类导入该文件  
  21.     //创建一个文章对象,在构造方法中传入文章的标题,文章的主体内容以及用户的操作选项  
  22.     $article=new Acticle($_POST["subject"], $_POST["message"],$_POST["parse"]);  
  23.     echo $article->getSubject();   //调用文章对象中的获取标题方法,输出文件的标题  
  24.     echo "<hr>";               //输出一个分隔线,用来分隔文章的标题和主体内容  
  25.     echo $article->getMessage();  //调用文章对象中的获取文章内容的方法,输出文章的主体内容  
  26. ?>  

</div> <!-- 下面定义文章的标题和文章内容的输入框,使用样式表取消换行在右边显示 --><div style="width:300; float:left"> <h5>标题<input type="text" name="subject" size=50></h5><h5>内容<textarea rows="7" cols="50" name="message"></textarea></h5><input type="submit" name="replysubmit" value="发表帖子"></div></table></form>很简单,纯粹的html代码,要提交三个信息,用post方法传递,$_POST["subject"], $_POST["message"],$_POST["parse"]特别注意parse[]的[]不能去掉,因为提交的是一个数组。

然后提交的信息会传给viewthread.php

  1. <?php  
  2.     require "acticle_class.php";    //包含脚本文件acticle_class.php,将文章类导入该文件  
  3.     //创建一个文章对象,在构造方法中传入文章的标题,文章的主体内容以及用户的操作选项  
  4.     $article=new Acticle($_POST["subject"], $_POST["message"],$_POST["parse"]);  
  5.     echo $article->getSubject();   //调用文章对象中的获取标题方法,输出文件的标题  
  6.     echo "<hr>";               //输出一个分隔线,用来分隔文章的标题和主体内容  
  7.     echo $article->getMessage();  //调用文章对象中的获取文章内容的方法,输出文章的主体内容  
  8. ?>  

它做的事也很简单,但是从中我们可以看出一般的项目怎么开发,浩哥把这个叫做接口,道理很简单,你只要包含这个类,调用它的方法就可以实现我们需要的功能,多方便,封装性也很好,大的项目拆分成若干个接口,每个接口做自己该做的事,一个人做几个,再接口间相互调用,大点的项目就可以基本成型了。

然后我们来看看,最核心的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表示匹配参数 中间有|表示或,具体可以自己参考网上资料或者书。常常用在我们的用户登录上。



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值