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 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;
    }
}

 

  示例代码下载

  示例效果:

 

posted @ 2020-07-19 10:53  孤舟残月浅笑嫣然  阅读(593)  评论(0编辑  收藏  举报