Heim  >  Artikel  >  php教程  >  Detaillierte Erläuterung der Verwendung des Zend Framework-Filters Zend_Filter

Detaillierte Erläuterung der Verwendung des Zend Framework-Filters Zend_Filter

高洛峰
高洛峰Original
2017-01-06 09:39:161262Durchsuche

Das Beispiel in diesem Artikel beschreibt die Verwendung des Zend Framework-Filters Zend_Filter. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Einführung: Filter ist der Prozess des Filterns des Eingabeinhalts, des Entfernens des Inhalts, der nicht den Filterregeln entspricht, und des Zurückgebens des verbleibenden Inhalts.

In Zend gibt es eine Zend_Filter-Komponente, um die Filterfunktion zu implementieren. Es gibt eine Unterklasse Zend_Filter_Interface, die eine Schnittstelle zum Implementieren allgemeiner Filter bereitstellt.

Um die Filterklasse zu implementieren, müssen Sie eine Methode namens filter() in dieser Schnittstelle implementieren.

Im Folgenden wird anhand eines Beispiels gezeigt, wie der in Zend_Filter definierte Filter verwendet wird. Dieses Beispiel zeigt, wie die Funktion zum Konvertieren von Buchstaben in Kleinbuchstaben implementiert wird.

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

Ergebnis:

Inhalt: ABCDefGH
Nach dem Filtern: abcdefgh
Inhalt: Ich liebe Nan Jing
Nach dem Filtern: Ich liebe Nan Jing

Warum ist es so magisch? Es weckt in mir den Wunsch, seine innere Struktur zu erkunden! Schauen wir uns das interne Funktionsprinzip an.

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

Studie:

Die Bedeutung des Quellcodes besteht wahrscheinlich darin, zuerst die Zend_Filter_Interface-Schnittstelle zu implementieren.

Definieren Sie eine private Variable $_encoding. Der Anfangswert ist im Allgemeinen null. Private Variablen beginnen mit _underscore.

Führen Sie dann die Initialisierungsarbeiten über den Konstruktor durch und legen Sie die Codierung fest.

Was den Zweck dieses Codierungsattributs betrifft, bin ich mir nicht sicher. Jedenfalls wurde dafür viel Code in den Quellcode geschrieben. Es gibt drei Methoden in der Klasse

: eine ist setEncoding, eine ist getEncoding und eine Hauptfunktion ist filter. Es gibt zwei Methoden, die beide für die Kodierung geschrieben wurden.

Um die setEncoding-Methode im Konstruktor zu verwenden, verwenden Sie einfach $this->setEncoding(). Anschließend können Sie den Wert des privaten Attributs festlegen.

Wählen Sie dann basierend auf dem Inhalt des privaten Attributs aus, welche Methode verwendet werden soll, um Buchstaben in Kleinbuchstaben umzuwandeln.

Lassen Sie mich los, es gibt wirklich genug Dinge, die es in dieser Kategorie zu beachten gilt. Tatsächlich besteht der Kerncode nur aus diesen beiden Sätzen: strtolower((string) $value).

Dieser Kurs ist cool, ich nutze nie private Grundstücke. Die betrachteten Themen sind nicht so umfassend wie die des Autors, da verschiedene Überprüfungen und verschiedene Situationen berücksichtigt werden. Zum Beispiel

Man erkennt am Konstrukteur, wie umfassend er das Problem betrachtet.

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

Insgesamt ist es bewundernswert.

Sprechen wir über die Filterkette. Ihre Funktion besteht darin, mehrere Filter in Reihe zu schalten und gemeinsam zu verwenden. Eine Filterkette ist eine Verbindung mehrerer Filter. Beim Filtern des angegebenen Inhalts

Jeder Filter führt Filter- oder Konvertierungsvorgänge in seiner Reihenfolge aus. Wenn alle Filtervorgänge abgeschlossen sind, gibt die Filterkette die endgültigen gefilterten Ergebnisse zurück.

Klingt interessant!

Was sind die konkreten Umsetzungsschritte?

Instanziieren Sie zunächst ein Objekt für die Klasse Zend_Filter und fügen Sie dann über die addFilter()-Methode der Instanz einen Filter zur Filterkette hinzu.

Das folgende Beispiel zeigt, wie Filterketten verwendet werden, um mehrere Filter und Transformationen von Daten durchzuführen.

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

Ergebnis:

Inhalt: 12345asdf67asdfasdf
Nach dem Filtern: ASDFASDFASDF
Inhalt: #$%^!@fffff
Nach dem Filtern lautet es: FFFFF
Inhalt: Willkommen bei Bei Jing
Nach dem Filtern lautet es: WILLKOMMEN BEI BEI JING

Analyse:

Das Alpha hier ist sehr leistungsfähig, es kann Zahlen und Sonderzeichen, sogar Leerzeichen, filtern. Glücklicherweise habe ich bei der Initialisierung einen Parameter „ “ hinzugefügt, damit die Leerzeichen erhalten bleiben.

Warum ist es so magisch?

Dies ist der Kerncode

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

Analyse: Der Inhalt wird hier gefiltert, wenn es sich nicht um Buchstaben oder Leerzeichen handelt entfernt werden. Die verwendete PHP-Methode ist preg_replace. Darüber hinaus werden reguläre Ausdrücke verwendet. [^a-zA-Z] repräsentiert darüber hinaus noch andere Zeichen.

Das $whiteSpace-Mitgliedsattribut wird hier während der Initialisierung festgelegt. Der spezifische Code lautet wie folgt:

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

Darüber hinaus gibt es zwei Eine Methode zum Festlegen, ob Leerzeichen zulässig sind, und zum Ermitteln, ob Leerzeichen zulässig sind.

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

Nachdem wir es analysiert haben, scheinen wir seine Struktur besser zu verstehen, was lediglich auf die regelmäßige Filterung zurückzuführen ist. Gleichzeitig wird über das AttributallowWhiteSpace gesteuert, ob Leerzeichen gefiltert werden sollen.

Ich habe gerade zwei Filter eingeführt, einer ist StringToUpper und der andere ist Alpha. Hier sind einige andere Filter.

Die erste ist Alnum, die nicht-numerische und nicht aus Buchstaben bestehende Inhalte filtert. Die Ausführung der filter()-Methode gibt reine Zahlen- und Buchstabeninhalte zurück. Es ist die Kombination aus Zend_Filter_Alpha (Filterung von Nicht-Buchstaben) und Zend_Filter_Digits (Filtern nicht numerischer Werte) Union.

Ich werde keine konkreten Beispiele nennen, sie sind alle ähnlich.

Werfen wir einen Blick auf die interne Struktur,

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

Filtern Sie andere Inhalte als Buchstaben und Zahlen durch reguläre Ausdrücke.

Das Folgende ist der HtmlEntities-HTML-Filter.

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

Ergebnis:

Anhand der Ergebnisse können wir sehen, dass der HTML-Inhalt auf den ursprünglichen Code zurückgesetzt wird. Da es sich bei diesem Filter um eine Kapselung der Funktion htmlentities handelt, folgt er den Regeln dieser Funktion. Das heißt, „f149dc6bf831fc1a1cb4bb71ef737d5a“ werden nach einer solchen Konvertierung in eine Zeichenfolge umgewandelt.

Ich hoffe, dass dieser Artikel für jedermann bei der PHP-Programmierung auf Basis des Zend Framework-Frameworks hilfreich sein wird.

Für detailliertere Erklärungen zur Verwendung des Zend Framework-Filters Zend_Filter beachten Sie bitte die chinesische PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn