这里给出一个文章发布操作的示例,该示例虽然没有多大的实用价值,但涉及了php的字符串处理函数和正则表达式的应用,希望读者通过该实例的应用可以灵活地操作字符串。为了简化程序和认知上的方便,这里只给出了两个主文件。
viewthread.php文件:
<!DOCTYPE html> <html> <head> <title>文章发布操作示例</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="./library/bootstrap.min.css"> <script src="./library/jquery.min.js"></script> <script src="./library/popper.min.js"></script> <script src="./library/bootstrap.min.js"></script> <style> .article-box{ float: left; width:100%; height:400px; background-color:#dcdcdc; margin:20px 0px; border-radius:5px; border: solid 1px #789; padding:3px } </style> </head> <body> <div class="container"> <form method="post" action="viewthread.php" target="_ blank"> <h2 align="center">发表文章演示</h2> <!-- 下面定义一组选项,使用样式表将其输入在左边 --> <div style="width:200; float:left"> <h5>选项</h5> <div class="form-check"> <label class="form-check-label"> <input type= "checkbox" name="parse[]" value="1" class="form-check-input" />删除HTML标签 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type="checkbox" name="parse[]" value="2" class="form-check-input" /> 转换HTM标签为实体 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type= "checkbox" name="parse[]" value="3" class="form-check-input" checked />使用UBB代码 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type= "checkbox" name="parse[]" value="4" class="form-check-input" />开启URL识别 </label> </div> <div class="form-check" title="可用的表情::),/wc, 微笑】【:@, /fn, 发怒】【:kiss, /kill, /sa, 示爱】【:p, /tx, 偷笑】【:q, /dk, 大哭】"> <label class="form-check-label"> <input type= "checkbox" name="parse[]" value="5" class="form-check-input" checked>使用表情 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type="checkbox" name="parse[]" value="6" class="form-check-input" />禁用非法关键字 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type="checkbox" name="parse[]" value="7" class="form-check-input" />PHP代码设为高亮 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type="checkbox" name="parse[]" value="8" class="form-check-input" />原样显示 </label> </div> <div class="form-check"> <label class="form-check-label"> <input type="checkbox" name="parse[]" value="9" class="form-check-input" /> 同步换行 </label> </div> </div> <!-- 下面定义文章标题和文章内容的输入框,使用样式表取消换行,在右边显示--> <div style="width:300; float: left"> <h5>标题</h5> <input type= "text" name= "subject" id="subject" class="form-control"> <h5>内容</h5> <textarea rows="7" cols="50" name="message" id="message" class="form-control"></textarea> <input type="submit" name="replysubmit" value="发表帖子" class="btn btn-primary"> </div> </form> <?php /** file: viewthread.php 文章处理脚本 */ //包含脚本文件acticle.class.php,将文章类导入该文件 require "article.class.php"; //创建一个文章对象,在构造方法中传入文章的标题、文章的主体内容及用户的操作选项 $article = new Acticle($_POST["subject"], $_POST ["message"], $_POST["parse"]) ; //调用文章对象中的获取标题方法,输出文章的标题 $subject = $article->getSubject(); //调用文章对象中的获取内容方法,输出文章的内容 $message = $article->getMessage(); //用界定符输出HTML代码,界定符类似双引号,可以输出变量 echo <<<EOF <div class="article-box"> {$subject} <hr /> {$message} </div> EOF; ?> <div> <script> //向输入框写入预定内容 $(document).ready(function(){ //向标题框写入内容 $("#subject").val("这是标题内容"); //向内容框写入内容,因为内容太长,用数组切断后连接 var content = [‘[b]美女图片:[/b]‘, ‘[img width="100%"]./img/a.jpg[/img]<br>‘, ‘这是emoji表情 :) /wx 微笑 大笑‘ ].join(""); $("#message").val(content); }); </script> </body> </html>
上面引用的bootstrap前端框架可引用公网上CDN的:
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
article.class.php文件:
<?php /* file: article class. 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初值 } //此私有方法用来删除HTML标记 private function delHtmlTags($message){ return strip_tags($message); //调用字符串处理函数删除HTML标记 } //此私有方法用来将HTML标记转为HTML实体 private function html2Text($message){ return htmlspecialchars(stripslashes($message)); //调用字符串处程函数进行作 } //此私有方法有来解析UBB代码 private function UBBCode2Html($message){ //声明正则表达式的模板数组 $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\\1 src="\\2">‘, ‘</font>‘, ‘</font>‘, ‘</font>‘, ‘</p>‘ ); //调用正则表达式的替换函数 return preg_replace($pattern, $replace, $message); } //此私有方法用来剪切长的URL,并加上链接 private function cuturl($url){ $length = 65; $urllink = "<a href=\"" . (substr(strtolower($url), 0, 4) == ‘www.‘ ? "http://{$url}" : $url) . ‘" target="_blank">‘; //如果UR长度大于65则剪切 if(strlen($url) > $length){ $url = substr($url, 0, intval($length * 0.5)) . ‘...‘ . substr($url, -intval($length * 0.3)); } $urllink .= $url . ‘</a>‘; return $urllink; } //此私有方法用来解析URL,将其加上链接 private function parseURL($message) { $urlPattern = "/(www.|https?:\/\/|ftp:\/\/|news:\/\/|telnet:\/\/){1}([^\[\"‘]+?)(com|cn|net|org)(\/[\w-\.\/\?\%\&\=]*)?/i"; //return preg_replace($urIPattern, "\$this->cuturI(‘\\1\\2\\3\\4‘)", $message); return preg_replace_callback($urlPattern, function($r){ return $this->cuturl("{$r[1] }{$r[2]}{$r[3]}{$r[4]}") ; }, $message); } //此方法用来解析表情 private function parseSmilies ($message) { $pattern = array( ‘/:\)|\/wx|微笑/i‘, ‘/:D|\/dx|大笑/i‘, ‘/:@|\/fn|发怒/i‘, ‘/:kiss|\/kill\/sa|示爱/‘, ‘/:p|\/tx|偷笑/i‘, ‘/:q|\/dk|大哭/i‘ ); $replace = array( ‘<img src="smilies/smile.png" alt="微笑" width="30px">‘, ‘<img src="smilies/laugh.png" alt="大笑" width="30px">‘, ‘<img src="smilies/huffy.png" alt="发怒" width="30px">‘, ‘<img src="smilies/kiss.png" alt="示爱" width="30px">‘, ‘<img src="smilies/titter.png" alt="偷笑" width="30px">‘, ‘<img src="smilies/cry.png" alt="大哭" width="30px">‘ ) ; return preg_replace($pattern, $replace, $message); } //此方法用来屏蔽文章中的非法关键字 private function disableKeyWords ($message) { $keywords_disable = array("非法关键字一", "非法关键宇二", "非法关键字三"); return str_replace($keywords_disable, "**", $message); } //此方法用来将PHP代码设置为高亮 private function prasePHPCode ($message){ $pattern = ‘/(<\?.*?\?>)/is‘; return preg_replace_callback($pattern, function($r) { return ‘<pre style="background: #ddd">‘ . highlight_string($r[1] , true) . ‘</pre>‘; }, $message); } //此方法用来将文章原样输出, 即加上<pre>标记 private function prasePer($message) { return ‘<pre>‘ . $message . ‘</pre>‘ ; } //此私有方法用来将换行符号转为<br>标记 private function nltobr($message) { return nl2br($message); } //此方法为公有的,返回文章的标题 public function getSubject() { return ‘<h1 align=center>‘ . $this->subject . ‘</h1>‘; } //此方法为公有的,返回文章的主体内容 public function getMessage() { return $this->message; } }
示例效果: