bbcodeparser.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 708 行 · 第 1/2 页

PHP
708
字号
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license,      |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Author: Stijn de Reede <sjr@gmx.co.uk>                               |// +----------------------------------------------------------------------+//// $Id: BBCodeParser.php,v 1.6 2004/01/18 23:26:16 sjr Exp $///*** @package  HTML_BBCodeParser* @author   Stijn de Reede  <sjr@gmx.co.uk>*** This is a parser to replace UBB style tags with their html equivalents. It* does not simply do some regex calls, but is complete stack based* parse engine. This ensures that all tags are properly nested, if not,* extra tags are added to maintain the nesting. This parser should only produce* xhtml 1.0 compliant code. All tags are validated and so are all their attributes.* It should be easy to extend this parser with your own tags, see the _definedTags* format description below.*** Usage:* $parser = new HTML_BBCodeParser();* $parser->setText('normal [b]bold[/b] and normal again');* $parser->parse();* echo $parser->getParsed();* or:* $parser = new HTML_BBCodeParser();* echo $parser->qparse('normal [b]bold[/b] and normal again');* or:* echo HTML_BBCodeParser::staticQparse('normal [b]bold[/b] and normal again');*** Setting the options from the ini file:* $config = parse_ini_file('BBCodeParser.ini', true);* $options = &PEAR::getStaticProperty('HTML_BBCodeParser', '_options');* $options = $config['HTML_BBCodeParser'];* unset($options);*** The _definedTags variables should be in this format:* array('tag'                                // the actual tag used*           => array('htmlopen'  => 'open',  // the opening tag in html*                    'htmlclose' => 'close', // the closing tag in html,*                                               can be set to an empty string*                                               if no closing tag is present*                                               in html (like <img>)*                    'allowed'   => 'allow', // tags that are allowed inside*                                               this tag. Values can be all*                                               or none, or either of these*                                               two, followed by a ^ and then*                                               followed by a comma seperated*                                               list of exceptions on this*                    'attributes' => array() // an associative array containing*                                               the tag attributes and their*                                               printf() html equivalents, to*                                               which the first argument is*                                               the value, and the second is*                                               the quote. Default would be*                                               something like this:*                                               'attr' => 'attr=%2$s%1$s%2$s'*                   ),*       'etc'*           => (...)*       )***/require_once ('PEAR.php');class HTML_BBCodeParser{    /**    * An array of tags parsed by the engine, should be overwritten by filters    *    * @access   private    * @var      array    */    var $_definedTags  = array();    /**    * A string containing the input    *    * @access   private    * @var      string    */    var $_text          = '';    /**    * A string containing the preparsed input    *    * @access   private    * @var      string    */    var $_preparsed     = '';    /**    * An array tags and texts build from the input text    *    * @access   private    * @var      array    */    var $_tagArray      = array();    /**    * A string containing the parsed version of the text    *    * @access   private    * @var      string    */    var $_parsed        = '';    /**    * An array of options, filled by an ini file or through the contructor    *    * @access   private    * @var      array    */    var $_options = array(  'quotestyle'    => 'single',                            'quotewhat'     => 'all',                            'open'          => '[',                            'close'         => ']',                            'xmlclose'      => true,                            'filters'       => 'Basic'                         );    /**    * An array of filters used for parsing    *    * @access   private    * @var      array    */    var $_filters       = array();    /**    * Constructor, initialises the options and filters    *    * Sets the private variable _options with base options defined with    * &PEAR::getStaticProperty(), overwriting them with (if present)    * the argument to this method.    * Then it sets the extra options to properly escape the tag    * characters in preg_replace() etc. The set options are    * then stored back with &PEAR::getStaticProperty(), so that the filter    * classes can use them.    * All the filters in the options are initialised and their defined tags    * are copied into the private variable _definedTags.    *    * @param    array           options to use, can be left out    * @return   none    * @access   public    * @author   Stijn de Reede  <sjr@gmx.co.uk>    */    function HTML_BBCodeParser($options = array())    {        /* set the already set options */        $baseoptions = &PEAR::getStaticProperty('HTML_BBCodeParser', '_options');        if (is_array($baseoptions)) {            foreach ($baseoptions as  $k => $v)  {                $this->_options[$k] = $v;            }        }        /* set the options passed as an argument */        foreach ($options as $k => $v )  {           $this->_options[$k] = $v;        }        /* add escape open and close chars to the options for preg escaping */        $preg_escape = '\^$.[]|()?*+{}';        if (strstr($preg_escape, $this->_options['open'])) {            $this->_options['open_esc'] = "\\".$this->_options['open'];        } else {            $this->_options['open_esc'] = $this->_options['open'];        }        if (strstr($preg_escape, $this->_options['close'])) {            $this->_options['close_esc'] = "\\".$this->_options['close'];        } else {            $this->_options['close_esc'] = $this->_options['close'];        }        /* set the options back so that child classes can use them */        $baseoptions = $this->_options;        unset($baseoptions);        /* return if this is a subclass */        if (is_subclass_of($this, 'HTML_BBCodeParser')) return;        /* extract the definedTags from subclasses */        $filters = explode(',', $this->_options['filters']);        foreach ($filters as $filter) {            $class = 'HTML_BBCodeParser_Filter_'.$filter;            @include_once ('HTML/BBCodeParser/Filter/'.$filter.'.php');            if (!class_exists($class)) {                PEAR::raiseError("Failed to load filter $filter", null, PEAR_ERROR_DIE);            }            $this->_filters[$filter] = new $class;            $this->_definedTags = array_merge($this->_definedTags, $this->_filters[$filter]->_definedTags);        }    }    /**    * Executes statements before the actual array building starts    *    * This method should be overwritten in a filter if you want to do    * something before the parsing process starts. This can be useful to    * allow certain short alternative tags which then can be converted into    * proper tags with preg_replace() calls.    * The main class walks through all the filters and and calls this    * method. The filters should modify their private $_preparsed    * variable, with input from $_text.    *    * @return   none    * @access   private    * @see      $_text    * @author   Stijn de Reede  <sjr@gmx.co.uk>    */    function _preparse()    {        /* default: assign _text to _preparsed, to be overwritten by filters */        $this->_preparsed = $this->_text;        /* return if this is a subclass */        if (is_subclass_of($this, 'HTML_BBCodeParser')) return;        /* walk through the filters and execute _preparse */        foreach ($this->_filters as $filter) {            $filter->setText($this->_preparsed);            $filter->_preparse();            $this->_preparsed = $filter->getPreparsed();        }    }    /**    * Builds the tag array from the input string $_text    *    * An array consisting of tag and text elements is contructed from the    * $_preparsed variable. The method uses _buildTag() to check if a tag is    * valid and to build the actual tag to be added to the tag array.    *    * TODO: - rewrite whole method, as this one is old and probably slow    *       - see if a recursive method would be better than an iterative one    *    * @return   none    * @access   private    * @see      _buildTag()    * @see      $_text    * @see      $_tagArray    * @author   Stijn de Reede  <sjr@gmx.co.uk>    */    function _buildTagArray()    {        $this->_tagArray = array();        $str = $this->_preparsed;        $strPos = 0;        $strLength = strlen($str);        while ( ($strPos < $strLength) ) {            $tag = array();            $openPos = strpos($str, $this->_options['open'], $strPos);            if ($openPos === false) {                $openPos = $strLength;                $nextOpenPos = $strLength;            }            if ($openPos + 1 > $strLength) {                $nextOpenPos = $strLength;            } else {                $nextOpenPos = strpos($str, $this->_options['open'], $openPos + 1);                if ($nextOpenPos === false) {                    $nextOpenPos = $strLength;                }            }            $closePos = strpos($str, $this->_options['close'], $strPos);            if ($closePos === false) {                $closePos = $strLength + 1;            }            if ( $openPos == $strPos ) {                if ( ($nextOpenPos < $closePos) ) {                    /* new open tag before closing tag: treat as text */                    $newPos = $nextOpenPos;                    $tag['text'] = substr($str, $strPos, $nextOpenPos - $strPos);                    $tag['type'] = 0;                } else {                    /* possible valid tag */                    $newPos = $closePos + 1;                    $newTag = $this->_buildTag(substr($str, $strPos, $closePos - $strPos + 1));                    if ( ($newTag !== false) ) {                        $tag = $newTag;                    } else {                    /* no valid tag after all */                        $tag['text'] = substr($str, $strPos, $closePos - $strPos + 1);                        $tag['type'] = 0;                    }                }            } else {                /* just text */                $newPos = $openPos;                $tag['text'] = substr($str, $strPos, $openPos - $strPos);                $tag['type'] = 0;            }            /* join 2 following text elements */            if ($tag['type'] === 0 && isset($prev) && $prev['type'] === 0) {                $tag['text'] = $prev['text'].$tag['text'];                array_pop($this->_tagArray);            }            $this->_tagArray[] = $tag;            $prev = $tag;            $strPos = $newPos;        }    }    /**    * Builds a tag from the input string    *    * This method builds a tag array based on the string it got as an    * argument. If the tag is invalid, <false> is returned. The tag    * attributes are extracted from the string and stored in the tag    * array as an associative array.    *

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?