Maison > php教程 > PHP开发 > Explication détaillée de l'utilisation du filtre Zend Framework Zend_Filter

Explication détaillée de l'utilisation du filtre Zend Framework Zend_Filter

高洛峰
Libérer: 2017-01-06 09:39:16
original
1335 Les gens l'ont consulté

L'exemple de cet article décrit l'utilisation du filtre Zend Framework Zend_Filter. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Introduction : Le filtre est le processus de filtrage du contenu d'entrée, de suppression du contenu qui ne répond pas aux règles de filtrage et de renvoi du contenu restant.

Il existe un composant Zend_Filter dans Zend pour implémenter la fonction de filtrage. Il existe une sous-classe Zend_Filter_Interface, qui fournit une interface pour implémenter des filtres généraux.

Pour implémenter la classe filter, vous devez implémenter une méthode nommée filter() dans cette interface.

Ce qui suit utilise un exemple pour montrer comment utiliser le filtre défini dans Zend_Filter. Cet exemple montre comment implémenter la fonction de conversion des lettres en minuscules.

Code :

<?php
require_once &#39;Zend/Filter/StringToLower.php&#39;;  //加载子类
$filter = new Zend_Filter_StringToLower;    //实例化对象
$temp1 = "ABCDefGH";              //定义待过滤内容
$temp2 = "我爱Nan Jing";
echo "内容:".$temp1."<p>经过滤后为:";
echo $filter->filter($temp1);
echo "<p>";
echo "内容:".$temp2."<p>经过滤后为:";
echo $filter->filter($temp2);
Copier après la connexion

Résultat :

Contenu : ABCDefGH
Après filtrage : abcdefgh
Contenu : J'aime Nan Jing
Après filtrage : J'aime Nan Jing

Pourquoi est-ce si magique ? Cela me donne envie d’explorer sa structure interne ! Étudions son principe de fonctionnement interne.

class Zend_Filter_StringToLower implements Zend_Filter_Interface
{
  /**
   * Encoding for the input string
   *
   * @var string
   */
  protected $_encoding = null;
  /**
   * Constructor
   *
   * @param string|array|Zend_Config $options OPTIONAL
   */
  public function __construct($options = null)
  {
    if ($options instanceof Zend_Config) {
      $options = $options->toArray();
    } else if (!is_array($options)) {
      $options = func_get_args();
      $temp  = array();
      if (!empty($options)) {
        $temp[&#39;encoding&#39;] = array_shift($options);
      }
      $options = $temp;
    }
    if (!array_key_exists(&#39;encoding&#39;, $options) && function_exists(&#39;mb_internal_encoding&#39;)) {
      $options[&#39;encoding&#39;] = mb_internal_encoding();
    }
    if (array_key_exists(&#39;encoding&#39;, $options)) {
      $this->setEncoding($options[&#39;encoding&#39;]);
    }
  }
  /**
   * Returns the set encoding
   *
   * @return string
   */
  public function getEncoding()
  {
    return $this->_encoding;
  }
  /**
   * Set the input encoding for the given string
   *
   * @param string $encoding
   * @return Zend_Filter_StringToLower Provides a fluent interface
   * @throws Zend_Filter_Exception
   */
  public function setEncoding($encoding = null)
  {
    if ($encoding !== null) {
      if (!function_exists(&#39;mb_strtolower&#39;)) {
        require_once &#39;Zend/Filter/Exception.php&#39;;
        throw new Zend_Filter_Exception(&#39;mbstring is required for this feature&#39;);
      }
      $encoding = (string) $encoding;
      if (!in_array(strtolower($encoding), array_map(&#39;strtolower&#39;, mb_list_encodings()))) {
        require_once &#39;Zend/Filter/Exception.php&#39;;
        throw new Zend_Filter_Exception("The given encoding &#39;$encoding&#39; is not supported by mbstring");
      }
    }
    $this->_encoding = $encoding;
    return $this;
  }
  /**
   * Defined by Zend_Filter_Interface
   *
   * Returns the string $value, converting characters to lowercase as necessary
   *
   * @param string $value
   * @return string
   */
  public function filter($value)
  {
    if ($this->_encoding !== null) {
      return mb_strtolower((string) $value, $this->_encoding);
    }
    return strtolower((string) $value);
  }
}
Copier après la connexion

Étude :

La signification du code source est probablement d'implémenter d'abord l'interface Zend_Filter_Interface.

Définissez une variable privée $_encoding. La valeur initiale est nulle Généralement, les variables privées commencent par _underscore.

Effectuez ensuite le travail d'initialisation via le constructeur et définissez l'encodage.

En ce qui concerne le but de cet attribut d'encodage, je ne suis pas sûr. Quoi qu'il en soit, beaucoup de code source a été écrit pour cela. Il existe trois méthodes dans la classe

, l'une est setEncoding, l'autre est getEncoding et un filtre de fonction principale. Il existe deux méthodes écrites pour le codage.

Pour utiliser la méthode setEncoding dans le constructeur, utilisez simplement $this->setEncoding(). Ensuite, vous pouvez définir la valeur de l'attribut privé.

Choisissez ensuite la méthode à utiliser pour rendre les lettres en minuscules en fonction du contenu de l'attribut privé.

Laissez-moi partir, il y a vraiment assez de choses à considérer dans cette catégorie. En fait, le code principal est constitué uniquement de ces deux phrases, strtolower((string) $value).

Ce cours est cool, je n'utilise jamais de propriétés privées. Les problématiques abordées ne sont pas aussi complètes que celles de l'auteur, avec diverses vérifications et diverses situations envisagées. Par exemple,

Vous pouvez voir du constructeur à quel point il considère le problème de manière globale.

if ($options instanceof Zend_Config) {
  $options = $options->toArray();
} else if (!is_array($options)) {
  $options = func_get_args();
  $temp  = array();
  if (!empty($options)) {
    $temp[&#39;encoding&#39;] = array_shift($options);
  }
  $options = $temp;
}
if (!array_key_exists(&#39;encoding&#39;, $options) && function_exists(&#39;mb_internal_encoding&#39;)) {
  $options[&#39;encoding&#39;] = mb_internal_encoding();
}
if (array_key_exists(&#39;encoding&#39;, $options)) {
  $this->setEncoding($options[&#39;encoding&#39;]);
}
Copier après la connexion

Dans l’ensemble, il est digne d’admiration.

Parlons de la chaîne de filtres. Sa fonction est de connecter plusieurs filtres en série et de les utiliser ensemble. Une chaîne de filtres est une connexion de plusieurs filtres. Lors du filtrage du contenu spécifié,

Chaque filtre effectuera des opérations de filtrage ou de conversion dans son ordre. Lorsque toutes les opérations de filtrage sont terminées, la chaîne de filtres renvoie les résultats finaux filtrés.

Ça a l’air intéressant !

Quelles sont les étapes spécifiques de mise en œuvre ?

Instanciez d'abord un objet pour la classe Zend_Filter, puis ajoutez un filtre à la chaîne de filtres via la méthode addFilter() de l'instance.

L'exemple suivant montre comment utiliser des chaînes de filtres pour effectuer plusieurs filtrages et transformations de données.

Code :

<?php
require_once &#39;Zend/Filter.php&#39;;         //加载Zend_Filter类
require_once &#39;Zend/Filter/Alpha.php&#39;;      //加载Zend_Filter_Alpha子类
require_once &#39;Zend/Filter/StringToUpper.php&#39;;  //加载Zend_Filter_StringToUpper子类
$filterChain = new Zend_Filter();        //创建过滤器链
$filterChain ->addFilter(new Zend_Filter_Alpha(" "))
  ->addFilter(new Zend_Filter_StringToUpper());//向过滤器链中添加过滤器
$temp1 = "12345asdf67asdfasdf";
$temp2 = "#$%^!@fffff";
$temp3 = "Welcome to Bei Jing";
echo "内容:".$temp1."<p>经过过滤后为:";
echo $filterChain->filter($temp1);
echo "<p>";
echo "内容:".$temp2."<p>经过过滤后为:";
echo $filterChain->filter($temp2);
echo "<p>";
echo "内容:".$temp3."<p>经过过滤后为:";
echo $filterChain->filter($temp3);
echo "<p>";
Copier après la connexion

Résultat :

Contenu : 12345asdf67asdfasdf
Après filtrage : ASDFASDFASDF
Contenu : #$%^!@fffff
Après filtrage, c'est : FFFFF
Contenu : Bienvenue à Bei Jing
Après filtrage, c'est : BIENVENUE À BEI JING

Analyse :

L'Alpha ici est très puissant, il peut filtrer les chiffres et les caractères spéciaux, même les espaces. Heureusement, j'ai ajouté un paramètre " " lors de l'initialisation, afin que les espaces soient conservés.

Pourquoi est-ce si magique ?

C'est le code de base

public function filter($value)
{
    $whiteSpace = $this->allowWhiteSpace ? &#39;\s&#39; : &#39;&#39;;
    if (!self::$_unicodeEnabled) {
      // POSIX named classes are not supported, use alternative a-zA-Z match
      $pattern = &#39;/[^a-zA-Z&#39; . $whiteSpace . &#39;]/&#39;;
    } else if (self::$_meansEnglishAlphabet) {
      //The Alphabet means english alphabet.
      $pattern = &#39;/[^a-zA-Z&#39; . $whiteSpace . &#39;]/u&#39;;
    } else {
      //The Alphabet means each language&#39;s alphabet.
      $pattern = &#39;/[^\p{L}&#39; . $whiteSpace . &#39;]/u&#39;;
    }
    return preg_replace($pattern, &#39;&#39;, (string) $value);
}
Copier après la connexion

Analyse : Le contenu est filtré ici. S'il ne s'agit pas de lettres ou d'espaces, tout le sera. être retiré. La méthode php utilisée est preg_replace. De plus, des expressions régulières sont utilisées. [^a-zA-Z] représente d'autres caractères en plus de celui-ci.

L'attribut membre $whiteSpace ici est défini lors de l'initialisation. Le code spécifique est le suivant :

public function __construct($allowWhiteSpace = false)
{
    if ($allowWhiteSpace instanceof Zend_Config) {
      $allowWhiteSpace = $allowWhiteSpace->toArray();
    } else if (is_array($allowWhiteSpace)) {
      if (array_key_exists(&#39;allowwhitespace&#39;, $allowWhiteSpace)) {
        $allowWhiteSpace = $allowWhiteSpace[&#39;allowwhitespace&#39;];
      } else {
        $allowWhiteSpace = false;
      }
    }
    $this->allowWhiteSpace = (boolean) $allowWhiteSpace;
    if (null === self::$_unicodeEnabled) {
      self::$_unicodeEnabled = (@preg_match(&#39;/\pL/u&#39;, &#39;a&#39;)) ? true : false;
    }
    if (null === self::$_meansEnglishAlphabet) {
      $this->_locale = new Zend_Locale(&#39;auto&#39;);
      self::$_meansEnglishAlphabet = in_array($this->_locale->getLanguage(),
      array(&#39;ja&#39;, &#39;ko&#39;, &#39;zh&#39;)
      );
    }
}
Copier après la connexion

De plus, il y a. two Une méthode pour définir si les espaces sont autorisés et pour obtenir si les espaces sont autorisés.

/**
* Returns the allowWhiteSpace option
*
* @return boolean
*/
public function getAllowWhiteSpace()
{
    return $this->allowWhiteSpace;
}
/**
* Sets the allowWhiteSpace option
*
* @param boolean $allowWhiteSpace
* @return Zend_Filter_Alpha Provides a fluent interface
*/
public function setAllowWhiteSpace($allowWhiteSpace)
{
    $this->allowWhiteSpace = (boolean) $allowWhiteSpace;
    return $this;
}
Copier après la connexion

Après l'avoir analysé, nous semblons mieux comprendre sa structure, qui utilise simplement un filtrage régulier. Dans le même temps, l'attribut allowWhiteSpace est utilisé pour contrôler s'il faut filtrer les espaces.

Je viens d'introduire deux filtres, l'un est StringToUpper et l'autre est Alpha. Voici quelques autres filtres.

Le premier est Alnum, qui filtre le contenu non numérique et non alphabétique. L'exécution de la méthode filter() renverra du contenu numérique et alphabétique pur. C'est la combinaison de Zend_Filter_Alpha (filtrage des non-lettres) et Zend_Filter_Digits. (filtrage des valeurs non numériques) Union.

Je ne donnerai pas d’exemples précis, ils sont tous similaires.

Jetons un coup d'œil à sa structure interne,

public function filter($value)
{
    $whiteSpace = $this->allowWhiteSpace ? &#39;\s&#39; : &#39;&#39;;
    if (!self::$_unicodeEnabled) {
      // POSIX named classes are not supported, use alternative a-zA-Z0-9 match
      $pattern = &#39;/[^a-zA-Z0-9&#39; . $whiteSpace . &#39;]/&#39;;
    } else if (self::$_meansEnglishAlphabet) {
      //The Alphabet means english alphabet.
      $pattern = &#39;/[^a-zA-Z0-9&#39; . $whiteSpace . &#39;]/u&#39;;
    } else {
      //The Alphabet means each language&#39;s alphabet.
      $pattern = &#39;/[^\p{L}\p{N}&#39; . $whiteSpace . &#39;]/u&#39;;
    }
    return preg_replace($pattern, &#39;&#39;, (string) $value);
}
Copier après la connexion

Filtrer le contenu autre que les lettres et les chiffres via des expressions régulières.

Ce qui suit est le filtre HTML HtmlEntities.

Code :

<?php
require_once &#39;Zend/Filter/Htmlentities.php&#39;;
$filter = new Zend_Filter_HtmlEntities();
$temp1 = "<img src = &#39;./1.png&#39; width=&#39;100px&#39;>";
$temp2 = "<button>aaa</button>";
$temp3 = "<h1>Welcome to Bei Jing</h1>";
echo "内容:".$temp1."<p>经过过滤为:";
echo $filter->filter($temp1);
echo "<p>";
echo "内容:".$temp2."<p>经过过滤为:";
echo $filter->filter($temp2);
echo "<p>";
echo "内容:".$temp3."<p>经过过滤为:";
echo $filter->filter($temp3);
echo "<p>";
Copier après la connexion

Résultat :

Zend Framework过滤器Zend_Filter用法详解

A travers les résultats, nous pouvons voir qu'il restaure le contenu html au code d'origine. Puisque ce filtre est une encapsulation de la fonction htmlentities, il suit les règles de cette fonction. Autrement dit, convertissez "<" et ">" en "<" et ">" respectivement, le contenu HTML correspondant de

devient une chaîne affichée dans son format d'origine.

J'espère que cet article sera utile à la programmation PHP de chacun basée sur le framework Zend Framework.

Pour des explications plus détaillées sur l'utilisation du filtre Zend Framework Zend_Filter, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal