php⽂章发布操作⽰例
这⾥给出⼀个⽂章发布操作的⽰例,该⽰例虽然没有多⼤的实⽤价值,但涉及了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 >
<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 >
<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="/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
<script src="/jquery/3.2.1/jquery.min.js"></script>
<script src="/popper.js/1.12.5/umd/popper.min.js"></script>
<script src="/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="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.' ? "{$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 >' . 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;
}
}做好的html怎么发布
⽰例效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。