php文章发布操作代码示例
3年前
这里给出一个文章发布操作的示例,该示例虽然没有多大的实用价值,但涉及了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;
}
}
文章来源于:https://www.cnblogs.com/qingsong/p/13338977.html
rglygcvkbl
2年前 . LV.0
php