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 + -
显示快捷键?