⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 striptags.php

📁 Bug tracker, and reporter.
💻 PHP
字号:
<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @category   Zend * @package    Zend_Filter * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License * @version    $Id: StripTags.php 8064 2008-02-16 10:58:39Z thomas $ *//** * @see Zend_Filter_Interface */require_once 'Zend/Filter/Interface.php';/** * @category   Zend * @package    Zend_Filter * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */class Zend_Filter_StripTags implements Zend_Filter_Interface{    /**     * Unique ID prefix used for allowing comments     */    const UNIQUE_ID_PREFIX = '__Zend_Filter_StripTags__';    /**     * Whether comments are allowed     *     * If false (the default), then comments are removed from the input string.     *     * @var boolean     */    public $commentsAllowed;    /**     * Array of allowed tags and allowed attributes for each allowed tag     *     * Tags are stored in the array keys, and the array values are themselves     * arrays of the attributes allowed for the corresponding tag.     *     * @var array     */    protected $_tagsAllowed = array();    /**     * Array of allowed attributes for all allowed tags     *     * Attributes stored here are allowed for all of the allowed tags.     *     * @var array     */    protected $_attributesAllowed = array();    /**     * Sets the filter options     *     * @param  array|string $tagsAllowed     * @param  array|string $attributesAllowed     * @param  boolean      $allowComments     * @return void     */    public function __construct($tagsAllowed = null, $attributesAllowed = null, $commentsAllowed = false)    {        $this->setTagsAllowed($tagsAllowed);        $this->setAttributesAllowed($attributesAllowed);        $this->commentsAllowed = (boolean) $commentsAllowed;    }    /**     * Returns the tagsAllowed option     *     * @return array     */    public function getTagsAllowed()    {        return $this->_tagsAllowed;    }    /**     * Sets the tagsAllowed option     *     * @param  array|string $tagsAllowed     * @return Zend_Filter_StripTags Provides a fluent interface     */    public function setTagsAllowed($tagsAllowed)    {        if (!is_array($tagsAllowed)) {            $tagsAllowed = array($tagsAllowed);        }        foreach ($tagsAllowed as $index => $element) {            // If the tag was provided without attributes            if (is_int($index) && is_string($element)) {                // Canonicalize the tag name                $tagName = strtolower($element);                // Store the tag as allowed with no attributes                $this->_tagsAllowed[$tagName] = array();            }            // Otherwise, if a tag was provided with attributes            else if (is_string($index) && (is_array($element) || is_string($element))) {                // Canonicalize the tag name                $tagName = strtolower($index);                // Canonicalize the attributes                if (is_string($element)) {                    $element = array($element);                }                // Store the tag as allowed with the provided attributes                $this->_tagsAllowed[$tagName] = array();                foreach ($element as $attribute) {                    if (is_string($attribute)) {                        // Canonicalize the attribute name                        $attributeName = strtolower($attribute);                        $this->_tagsAllowed[$tagName][$attributeName] = null;                    }                }            }        }        return $this;    }    /**     * Returns the attributesAllowed option     *     * @return array     */    public function getAttributesAllowed()    {        return $this->_attributesAllowed;    }    /**     * Sets the attributesAllowed option     *     * @param  array|string $attributesAllowed     * @return Zend_Filter_StripTags Provides a fluent interface     */    public function setAttributesAllowed($attributesAllowed)    {        if (!is_array($attributesAllowed)) {            $attributesAllowed = array($attributesAllowed);        }        // Store each attribute as allowed        foreach ($attributesAllowed as $attribute) {            if (is_string($attribute)) {                // Canonicalize the attribute name                $attributeName = strtolower($attribute);                $this->_attributesAllowed[$attributeName] = null;            }        }        return $this;    }    /**     * Defined by Zend_Filter_Interface     *     * @todo improve docblock descriptions     *     * @param  string $value     * @return string     */    public function filter($value)    {        $valueCopy = (string) $value;        // If comments are allowed, then replace them with unique identifiers        if ($this->commentsAllowed) {            preg_match_all('/<\!--.*?--\s*>/s' , (string) $valueCopy, $matches);            $comments = array_unique($matches[0]);            foreach ($comments as $k => $v) {                $valueCopy = str_replace($v, self::UNIQUE_ID_PREFIX . $k, $valueCopy);            }        }        // Initialize accumulator for filtered data        $dataFiltered = '';        // Parse the input data iteratively as regular pre-tag text followed by a        // tag; either may be empty strings        preg_match_all('/([^<]*)(<?[^>]*>?)/', (string) $valueCopy, $matches);        // Iterate over each set of matches        foreach ($matches[1] as $index => $preTag) {            // If the pre-tag text is non-empty, strip any ">" characters from it            if (strlen($preTag)) {                $preTag = str_replace('>', '', $preTag);            }            // If a tag exists in this match, then filter the tag            $tag = $matches[2][$index];            if (strlen($tag)) {                $tagFiltered = $this->_filterTag($tag);            } else {                $tagFiltered = '';            }            // Add the filtered pre-tag text and filtered tag to the data buffer            $dataFiltered .= $preTag . $tagFiltered;        }        // If comments are allowed, then replace the unique identifiers with the corresponding comments        if ($this->commentsAllowed) {            foreach ($comments as $k => $v) {                $dataFiltered = str_replace(self::UNIQUE_ID_PREFIX . $k, $v, $dataFiltered);            }        }        // Return the filtered data        return $dataFiltered;    }    /**     * Filters a single tag against the current option settings     *     * @param  string $tag     * @return string     */    protected function _filterTag($tag)    {        // Parse the tag into:        // 1. a starting delimiter (mandatory)        // 2. a tag name (if available)        // 3. a string of attributes (if available)        // 4. an ending delimiter (if available)        $isMatch = preg_match('~(</?)(\w*)((/(?!>)|[^/>])*)(/?>)~', $tag, $matches);        // If the tag does not match, then strip the tag entirely        if (!$isMatch) {            return '';        }        // Save the matches to more meaningfully named variables        $tagStart = $matches[1];        $tagName = strtolower($matches[2]);        $tagAttributes = $matches[3];        $tagEnd = $matches[5];        // If the tag is not an allowed tag, then remove the tag entirely        if (!isset($this->_tagsAllowed[$tagName])) {            return '';        }        // Trim the attribute string of whitespace at the ends        $tagAttributes = trim($tagAttributes);        // If there are non-whitespace characters in the attribute string        if (strlen($tagAttributes)) {            // Parse iteratively for well-formed attributes            preg_match_all('/(\w+)=([\'"])((.(?!=\2))+)\2/s', $tagAttributes, $matches);            // Initialize valid attribute accumulator            $tagAttributes = '';            // Iterate over each matched attribute            foreach ($matches[1] as $index => $attributeName) {                $attributeName = strtolower($attributeName);                $attributeDelimiter = $matches[2][$index];                $attributeValue = $matches[3][$index];                // If the attribute is not allowed, then remove it entirely                if (!array_key_exists($attributeName, $this->_tagsAllowed[$tagName])                    && !array_key_exists($attributeName, $this->_attributesAllowed)) {                    continue;                }                // Add the attribute to the accumulator                $tagAttributes .= " $attributeName=" . $attributeDelimiter                                . $attributeValue . $attributeDelimiter;            }        }        // Reconstruct tags ending with "/>" as backwards-compatible XHTML tag        if (strpos($tagEnd, '/') !== false) {            $tagEnd = " $tagEnd";        }        // Return the filtered tag        return $tagStart . $tagName . $tagAttributes . $tagEnd;    }}

⌨️ 快捷键说明

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