Zend Framework kommt mit einem Standardset von Prüfklassen, welche fertig zur Verwendung sind.
Zend_Validate_Alnum
erlaubt es zu prüfen ob ein angegebener Wert
nur alphabetische Zeichen und Ziffern enthält. Es gibt keine Begrenzung der Länge für die
Eingabe welche geprüft werden soll.
Die folgenden Optionen werden von Zend_Validate_Alnum
unterstützt:
-
allowWhiteSpace: Ob Leerzeichen erlaubt sind. Diese Option ist standardmäßig
FALSE
Das folgende ist ein Standardbeispiel:
$validator = new Zend_Validate_Alnum(); if ($validator->isValid('Abcd12')) { // Der Wert enthält nur erlaubte Zeichen } else { // false }
Standardmäßig werden Leerzeichen nicht akzeptiert weil Sie nicht Teil des Alphabeths sind. Trotzdem gibt es einen Weg Sie als Eingabe zu akzeptieren. Das erlaubt es komplette Sätze oder Phrasen zu prüfen.
Um die Verwendung von Leerzeichen zu erlauben muss man die Option
allowWhiteSpace angeben. Das kann während der Erstellung einer
Instanz des Prüfers getan werden, oder im Nachhinein indem
setAllowWhiteSpace()
verwendet wird. Um den aktuellen Zustand
zu erhalten kann getAllowWhiteSpace()
verwendet werden.
$validator = new Zend_Validate_Alnum(array('allowWhiteSpace' => true)); if ($validator->isValid('Abcd und 12')) { // Der Wert enthält nur erlaubte Zeichen } else { // false }
Wenn Zend_Validate_Alnum
verwendet wird dann wird jene Sprache
verwendet, welche der Benutzer in seinem Browser gesetzt hat, um die erlaubten Zeichen
zu setzen. Das bedeutet, wenn ein Benutzer de für Deutsch setzt
dann kann er auch Zeichen wie ä, ö und
ü zusätzlich zu den Zeichen des englischen Alphabeths setzen.
Welche Zeichen erlaubt sind hängt komplett von der verwendeten Sprache ab, da jede Sprache Ihr eigenes Set von Zeichen definiert.
Es gibt aktuell 3 Sprachen welche nicht mit Ihrer eigenen Schreibweise akzeptiert werden. Diese Sprachen sind koreanisch, japanisch und chinesisch, da diese Sprachen ein Alphabeth verwenden bei dem einzelne Zeichen so aufgebaut werden dass Sie mehrere Zeichen verwenden.
Im Falle das diese Sprachen verwendet werden wird der Inhalt nur durch Verwendung des englischen Alphabeths geprüft.
Zend_Validate_Alpha
erlaubt es zu prüfen ob ein angegebener Wert nur
alphabetische Zeichen enthält. Es gibt keine Begrenzung der Länge für die Eingabe welche man
prüfen will. Diese Prüfung ist ähnlich wie die Zend_Validate_Alnum
Prüfung mit der Ausnahme dass Sie keine Ziffern akzeptiert.
Die folgenden Optionen werden von Zend_Validate_Alpha
unterstützt:
-
allowWhiteSpace: Ob Leerzeichen erlaubt sind. Diese Option ist standardmäßig
FALSE
Das folgende ist ein standardmäßiges Beispiel:
$validator = new Zend_Validate_Alpha(); if ($validator->isValid('Abcd')) { // Der Wert enthält nur erlaubte Zeichen } else { // false }
Standardmäßig werden Leerzeichen nicht akzeptiert weil Sie nicht Teil des Alphabeths sind. Trotzdem gibt es einen Weg Sie als Eingabe zu akzeptieren. Das erlaubt es komplette Sätze oder Phrasen zu prüfen.
Um die Verwendung von Leerzeichen zu erlauben muss man die Option
allowWhiteSpace angeben. Das kann während der Erstellung einer
Instanz des Prüfers getan werden, oder im Nachhinein indem
setAllowWhiteSpace()
verwendet wird. Um den aktuellen Zustand
zu erhalten kann getAllowWhiteSpace()
verwendet werden.
$validator = new Zend_Validate_Alpha(array('allowWhiteSpace' => true)); if ($validator->isValid('Abcd and efg')) { // Der Wert enthält nur erlaubte Zeichen } else { // false }
Wenn Zend_Validate_Alpha
verwendet wird dann wird jene Sprache
verwendet, welche der Benutzer in seinem Browser gesetzt hat, um die erlaubten Zeichen
zu setzen. Das bedeutet, wenn ein Benutzer de für Deutsch setzt
dann kann er auch Zeichen wie ä, ö und
ü zusätzlich zu den Zeichen des englischen Alphabeths setzen.
Welche Zeichen erlaubt sind hängt komplett von der verwendeten Sprache ab, da jede Sprache Ihr eigenes Set von Zeichen definiert.
Es gibt aktuell 3 Sprachen welche nicht mit Ihrer eigenen Schreibweise akzeptiert werden. Diese Sprachen sind koreanisch, japanisch und chinesisch, da diese Sprachen ein Alphabeth verwenden bei dem einzelne Zeichen so aufgebaut werden dass Sie mehrere Zeichen verwenden.
Im Falle das diese Sprachen verwendet werden wird der Inhalt nur durch Verwendung des englischen Alphabeths geprüft.
Zend_Validate_Barcode
erlaubt es zu prüfen ob ein gegebener Wert als
Barcode repräsentiert werden kann.
Zend_Validate_Barcode
unterstützt viele Barcode Standards und kann
sehr einfach mit prorietären Barcode Implementationen erweitert werden. Die folgenden
Barcode Standards werden unterstützt:
-
CODE25: Oft auch "Two of Five" oder "Code 25 Industrial" genannt.
Dieser Barcode hat keine Begrenzung der Länge. Es unterstützt nur Ziffern, und die letzte Ziffer kann eine optionale Checksumme sein welche durch Modulo 10 berechnet wird. Dieser Standard sehr alt und wird heutzutage nicht oft verwendet. Übliche Anwendungsfälle liegen in der Industrie.
-
CODE25INTERLEAVED: Oft auch "Code 2 of 5 Interleaved" genannt.
Dieser Standard ist eine Variante von CODE25. Er hat keine Begrenzung der Länge, muss aber eine gerade Anzahl an Zeichen enthalten. Es unterstützt nur Ziffern, und die letzte Ziffer kann eine optionale Checksumme sein welche durch Modulo 10 berechnet wird. Dieser Standard wird weltweit verwendet und üblicherweise im Handel.
-
CODE39: CODE39 ist einer der ältesten vorhandenen Codes.
Dieser Barcode hat eine variable Länge. Er unterstützt Ziffern, großgeschriebene alphabetische Zeichen und 7 spezielle Zeichen wie Leerzeichen, Punkte und Dollarzeichen. Er kann eine optionale Checksumme enthalten welche durch Modulo 43 berechnet wird. Dieser Standard wird weltweit verwendet und üblicherweise in der Industrie.
-
CODE39EXT: CODE39EXT ist eine Erweiterung von CODE39.
Dieser Barcode hat die gleichen Eigenschaften wie CODE39. Zusätzlich erlaubt er die Verwendung aller 128 ASCII Zeichen. Dieser Standard wird weltweit verwendet und ist in der Industrie üblich.
-
CODE93: CODE93 ist der Nachfolger von CODE39.
Dieser Barcode hat eine variable Länge. Er unterstützt Ziffern, alphabetische Zeichen und 7 spezielle Zeichen. Er enthält eine optionale Checksumme welche durch Modulo 47 berechnet wird und aus 2 Zeichen besteht. Dieser Standard produziert einen kompakteren Code als CODE39 und ist sicherer.
-
CODE93EXT: CODE93EXT ist eine Erweiterung von CODE93.
Dieser Barcode hat die gleichen Eigenschaften wie CODE93. Zusätzlich erlaubt er die Verwendung aller 128 ASCII Zeichen. Dieser Standard wird weltweit verwendung und ist in der Industrie üblich.
-
EAN2: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode muss 2 Zeichen haben. Er unterstützt nur Ziffern und hat keine Checksumme. Dieser Standard wird hauptsächlich als Zusatz zu EAN13 (ISBN) verwendet wenn diese auf Bücher gedruckt werden.
-
EAN5: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode muss 5 Zeichen haben. Er unterstützt nur Ziffern und hat keine Checksumme. Dieser Standard wird hauptsächlich als Zusatz zu EAN13 (ISBN) verwendet wenn diese auf Bücher gedruckt werden.
-
EAN8: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode kann eine Länge von 7 oder 8 Zeichen haben. Er unterstützt nur Ziffern. Wenn er 8 Zeichen lang ist enthält er eine Checksumme. Dieser Standard wird weltweit verwendet, hat aber eine sehr begrenzte Reichweite. Er kann auf kleinen Artikeln gefunden werden wo ein längerer Barcode nicht gedruckt werden könnte.
-
EAN12: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode muss eine Länge von 12 Zeichen haben. Er unterstützt nur Ziffern wobei die letzte Ziffer immer eine Checksumme ist welche durch Modulo 10 berechnet wird. Dieser Standard wird in der USA verwendet und hierbei üblicherweise im Handel. Er wurde ersetzt durch EAN13.
-
EAN13: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode muss eine Länge von 13 Zeichen haben. Er unterstützt nur Ziffern wobei die letzte Ziffer immer eine Checksumme ist welche durch Modulo 10 berechnet wird. Dieser Standard wird weltweit verwendet, üblicherweise im Handel.
-
EAN14: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode muss eine Länge von 14 Zeichen haben. Er unterstützt nur Ziffern wobei die letzte Ziffer immer eine Checksumme ist welche durch Modulo 10 berechnet wird. Dieser Standard wird weltweit verwendet, üblicherweise im Handel. Er ist der Nachfolger von EAN13.
-
EAN18: EAN ist die Abkürzung für "European Article Number".
Dieser Barcode muss eine Länge von 18 Zeichen haben. Er unterstützt nur Ziffern. Die letzte Ziffer ist immer eine Checksumme welche durch Modulo 10 berechnet wird. Dieser Code wird ost für die Identifizierung von Transport Containern verwendet.
-
GTIN12: GTIN ist die Abkürzung für "Global Trade Item Number".
Dieser Barcode verwendet den gleichen Standard wie EAN12 und ist sein Nachfolger. Er wird üblicherweise in den USA verwendet.
-
GTIN13: GTIN ist die Abkürzung für "Global Trade Item Number".
Dieser Barcode verwendet den gleichen Standard wie EAN13 und ist sein Nachfolger. Er wird weltweit von der Industrie verwendet.
-
GTIN14: GTIN ist die Abkürzung für "Global Trade Item Number".
Dieser Barcode verwendet den gleichen Standard wie EAN14 und ist sein Nachfolger. Er wird weltweit verwendet, üblicherweise im Handel.
-
IDENTCODE: Identcode wird von Deutsche Post und DHL verwendet. Es ist eine spezialisierte Implementation von Code25.
Dieser Barcode muss eine Länge von 12 Zeichen haben. Er unterstützt nur Ziffern und die letzte Ziffer ist immer eine Checksumme die mit Modulo 10 berechnet wird. Dieser Standard wird hauptsächlich von den Firmen DP und DHL verwendet.
-
INTELLIGENTMAIL: Intelligent Mail ist ein postalischer Barcode.
Dieser Barcode kann eine Länge von 20, 25, 29 oder 31 Zeichen haben. Er unterstützt nur Ziffern und enthält keine Checksumme. Dieser Standard ist der Nachfolger von PLANET und POSTNET. Er wird hauptsächlich von den United States Post Services verwendet.
-
ISSN: ISSN ist die Abkürzung für International Standard Serial Number.
Dieser Barcode kann eine Länge von 8 oder 13 Zeichen haben. Er unterstützt nur Ziffern wobei die letzte Ziffer eine Checksumme ist welche durch Modulo 11 berechnet wird. Er wird weltweit für gedruckte Publikationen verwendet.
-
ITF14: ITF14 ist die GS1 Implementation des Interleaved Two of Five Barcodes.
Dieser Barcode ist eine spezielle Variante von Interleaved 2 of 5. Er muss eine Länge von 14 Zeichen haben und basiert auf GTIN14. Er unterstützt nur Ziffern wobei die letzte Ziffer die Ziffer einer Checksumme ist welche durch Modulo 10 berechnet wird. Er wird weltweit verwendet, üblicherweise im Handel.
-
LEITCODE: Leitcode wird von Deutsche Post und DHL verwendet. Er ist eine spezialisierte Implementation von Code25.
Dieser Barcode muss eine Länge von 14 Zeichen haben. Er unterstützt nur Ziffern, wobei die letzte Ziffer immer eine Checksumme ist welche durch Modulo 10 berechnet wird. Dieser Standard wird hauptsächlich von den Firmen DP und DHL verwendet.
-
PLANET: Planet ist die Abkürzung für Postal Alpha Numeric Encoding Technique.
Dieser Barcode kann eine Länge von 12 oder 14 Zeichen haben. Er unterstützt nur Ziffern wobei die letzt Ziffer immer eine Checksumme ist. Dieser Standard wird hauptsächlich von den United States Post Services verwendet.
-
POSTNET: Postnet wird vom US Post Service verwendet.
Dieser Barcode kann eine Länge von 6, 7, 10 oder 12 Zeichen haben. Er unterstützt nur Ziffern wobei die letzte Ziffer immer eine Checksumme ist. Dieser Standard wird hauptsächlich von den United States Post Services verwendet.
-
ROYALMAIL: Royalmail wird von Royal Mail verwendet.
Dieser Barcode hat keine definierte Länge. Er unterstützt Ziffern, großgeschriebene Buchstaben und die letzte Ziffer ist immer eine Checksumme. Dieser Standard wird hauptsächlich von Royal Mail für deren Cleanmail Service verwendet. Er wird auch RM4SCC genannt.
-
SSCC: SSCC ist die Abkürzung für "Serial Shipping Container Code".
Dieser Barcode ist eine Variante des EAN Barcodes. Er muss eine Länge von 18 Zeichen enthalten und unterstützt nur Ziffern. Die letzte Ziffer muss ein Ziffer für eine Checksumme sein welche durch Modulo 10 berechnet wird. Er wird üblicherweise in der Transport Industrie verwendet.
-
UPCA: UPC ist die Abkürzung für "Univeral Product Code".
Dieser Barcode ist der Vorgänger von EAN13. Er muss eine Länge von 12 Zeichen haben und unterstützt nur Ziffern. Die letzte Ziffer muss die Ziffer einer Checksumme sein welche durch Modulo 10 berechnet wird. Er wird üblicherweise in den USA verwendet.
-
UPCE: UPCE ist die kurze Variante von UPCA.
Dieser Barcode ist die kleinere Variante von UPCA. Er muss eine Länge von 6, 7 oder 8 Zeichen haben und unterstützt nur Ziffern. Wenn der Barcode 8 Ziffern lang ist enthält er eine Checksumme die durch Modulo 10 berechnet wird. Er wird üblicherweise bei kleinen Produkten verwendet wo ein UPCA Barcode nicht passen würde.
Die folgenden Optionen werden für Zend_Validate_Barcode
unterstützt:
-
adapter: Setzt den Barcode Adapter welcher verwendet wird. Unterstützt werden alle vorher genannten Adapter. Wenn ein selbst definierter Adapter verwendet werden soll, muss man den kompletten Klassennamen setzen.
-
checksum:
TRUE
wenn der Barcode eine Prüfsumme enthalten soll. Der Standardwert hängt vom verwendeten Adapter ab. Es ist zu beachten das einige Adapter es nicht erlauben diese Option zu setzen. -
options: Definiert optionale Optionen für selbst geschriebene Adapter.
Um zu prüfen ob ein angegebener String ein Barcode ist muss man nur dessen Typ wissen. Siehe das folgende Beispiel für einen EAN13 Barcode:
$valid = new Zend_Validate_Barcode('EAN13'); if ($valid->isValid($input)) { // Die Eingabe scheint gültig zu sein } else { // Die Eingabe ist ungültig }
Einige Barcodes können mit einer optionalen Checksumme angegeben werden. Diese Barcodes würden gültig sein, selbst ohne Checksumme. Trotzdem, wenn eine Checksumme angegeben wird, dann sollte man Sie auch prüfen. Standardmäßig führen diese Barcode Typen keine Prüfung der Checksumme durch. Durch Verwendung der Option checksum kann man definieren ob die Checksumme geprüft oder ignoriert wird.
$valid = new Zend_Validate_Barcode(array( 'adapter' => 'EAN13', 'checksum' => false, )); if ($valid->isValid($input)) { // Die Eingabe scheint gültig zu sein } else { // Die Eingabe ist ungültig }
Reduzierte Sicherheit durch ausgeschaltete Prüfung der Checksumme
Indem die Prüfung der Checksumme ausgeschaltet wird, verringert man auch die Sicherheit der verwendeten Barcodes. Zusätzlich sollte man beachten dass man die Prüfung der Checksumme für jene Barcode Typen ausschalten kann welche einen Wert für die Checksumme enthalten müssen. Barcodes welche nicht gültig wären könnten dann als gültig zurückgegeben werden, selbst wenn Sie es nicht sind.
Man kann eigene Barcode Prüfungen für die Verwendung mit
Zend_Validate_Barcode
schreiben; das ist oft notwendig wenn man
mit proprietären Barcodes arbeiten muss. Um eine eigene Barcode Prüfung zu schreiben
benötigt man die folgenden Informationen.
-
Length: Die Länge welche der Barcode haben muss. Diese kann einen der folgenden Werte haben:
-
Integer: Ein Wert größer als 0, was bedeutet das der Barcode diese Länge haben muss.
-
-1: Es gibt keine Begrenzung der Länge für diesen Barcode.
-
"even": Die Länge dieses Barcodes muss eine gerade Anzahl an Ziffern enthalten.
-
"odd": Die Länge dieses Barcodes muss eine ungerade Anzahl an Ziffern enthalten.
-
array: Ein Array von Integer Werten. Die Länge dieses Barcodes muss einer der gesetzten Array Werte haben.
-
-
Characters: Ein String der die erlaubten Zeichen für diesen Barcode enthält. Auhc der Integer Wert 128 ist erlaubt, was für die ersten 128 Zeichen der ASCII Tabelle steht.
-
Checksum: Ein Strung der als Callback für eine Methode verwendet wird, welche die Prüfung der Checksumme durchführt.
Die eigene Barcode Prüfung muss
Zend_Validate_Barcode_AdapterAbstract
erweitern oder
Zend_Validate_Barcode_AdapterInterface implementieren.
Als Beispiel, erstellen wir eine Prüfung welche eine gerade Anzahl an Zeichen erwartet welche alle Ziffern und die Zeichen 'ABCDE' enthalten kann, und die eine Checksumme benötigt.
class My_Barcode_MyBar extends Zend_Validate_Barcode_AdapterAbstract { protected $_length = 'even'; protected $_characters = '0123456789ABCDE'; protected $_checksum = '_mod66'; protected function _mod66($barcode) { // Mach einige Prüfungen und gib ein Boolean zurück } } $valid = new Zend_Validate_Barcode('My_Barcode_MyBar'); if ($valid->isValid($input)) { // Die Eingabe scheint gültig zu sein } else { // Die Eingabe ist ungültig }
Zend_Validate_Between
erlaubt es zu prüfen ob ein angegebener Wert
zwischen zwei anderen Werten ist.
Zend_Validate_Between unterstützt nur die Prüfung von Nummern
Es ist zu beachten das Zend_Validate_Between
nur die Prüfung von
Nummern unterstützt. Strings, oder ein Datum können mit dieser Prüfung nicht geprüft
werden.
Die folgenden Optionen werden für Zend_Validate_Between
unterstützt:
-
inclusive: Definiert ob die Prüfung inklusive oder explusive der minimalen und maximalen Grenzwerte ist. Sie ist standardmäßig
TRUE
. -
max: Setzt die maximale Grenze für die Prüfung.
-
min: Setzt die minimale Grenze für die Prüfung.
Standardmäßig prüft diese Prüfung ob ein Wert zwischen min und max liegt wobei beide Grenzwerte als Wert erlaubt sind.
$valid = new Zend_Validate_Between(array('min' => 0, 'max' => 10)); $value = 10; $result = $valid->isValid($value); // Gibt true zurück
Im oben stehenden Beispiel ist das Ergebnis TRUE
da die Suche
standardmäßig inklusive den Grenzwerten stattfindet. Das bedeutet in unserem Fall das
jeder Wert zwischen '0' und '10' erlaubt ist. Und Werte wie '-1' und '11' geben
FALSE
zurück.
Manchmal ist es nützlich einen Wert zu prüfen wobei die Grenzwerte exkludiert werden. Siehe das folgende Beispiel:
$valid = new Zend_Validate_Between( array( 'min' => 0, 'max' => 10, 'inclusive' => false ) ); $value = 10; $result = $valid->isValid($value); // Gibt false zurück
Das Beispiel ist fast so ähnlich wie unser erstes Beispiel, aber wir haben die
Grenzwerte ausgeschlossen. Jetzt sind die Werte '0' und '10' nicht mehr erlaubt und
geben FALSE
zurück.
Zend_Validate_Callback
erlaubt es einen Callback anzugeben der
verwendet wird um einen angegebenen Wert zu prüfen.
Die folgenden Optionen werden für Zend_Validate_Callback
unterstützt:
-
callback: Setzt den Callback welcher für die Prüfung aufgerufen wird.
-
options: Setzt zusätzliche Optionen welche an den Callback übergeben werden.
Der einfachste Anwendungsfall besteht darin eine einzelne Funktion zu haben und diese als Callback zu verwenden. Angenommen wir haben die folgende Funktion.
function myMethod($value) { // einige Prüfungen return true; }
Um diese in Zend_Validate_Callback
zu verwenden muss man Sie
nur auf folgende Weise aufrufen:
$valid = new Zend_Validate_Callback('myMethod'); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
PHP 5.3 führt Closures ein,
welche grundsätzlich selbst-enthaltene oder anonyme Funktionen
sind. PHP nimmt an das Closures eine andere Form eines Callbacks
sind, und können daher als solche mit Zend_Validate_Callback
verwendet werden. Als Beispiel:
$valid = new Zend_Validate_Callback(function($value){ // einige Prüfungen return true; }); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Natürlich ist es auch möglich eine Klassenmethode als Callback zu verwenden. Angenommen wir haben die folgende Klassenmethode:
class MyClass { public function myMethod($value) { // einige Prüfungen return true; } }
Die Definition des Callbacks ist in diesem Fall fast die gleiche. Man muss nur eine Instanz der Klasse vor der Methode erstellen und ein Array das den Callback beschreibt:
$object = new MyClass; $valid = new Zend_Validate_Callback(array($object, 'myMethod')); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Man kann auch eine statische Methode als Callback definieren. Angenommen wir haben die folgende Klassendefinition dann ist die Verwendung des Prüfers wie folgt:
class MyClass { public static function test($value) { // Einige Prüfungen return true; } } $valid = new Zend_Validate_Callback(array('MyClass', 'test')); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Letztendlich kann man, wenn man PHP 5.3 verwendet, die magische
Methode __invoke()
in der eigenen Klasse definieren. Wenn man
das tut dann funktioniert die Angabe einer Instanz der Klasse genauso:
class MyClass { public function __invoke($value) { // some validation return true; } } $object = new MyClass(); $valid = new Zend_Validate_Callback($object); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Zend_Validate_Callback
erlaubt auch die Verwendung von Optionen
welche als zusätzliche Argumente dem Callback übergeben werden.
Nehmen wir die folgende Klassen und Methoden Definition an:
class MyClass { function myMethod($value, $option) { // einige Prüfungen return true; } }
Es gibt zwei Wege um den Prüfer über zusätzliche Optionen zu informieren: Diese im
Constructor übergeben, oder Sie mit der Methode setOptions()
übergeben.
Um Sie im Contructor zu übergeben, muss ein Array übergeben werden das die zwei Schlüssel "callback" und "options" enthält:
$valid = new Zend_Validate_Callback(array( 'callback' => array('MyClass', 'myMethod'), 'options' => $option, )); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Andererseits können Sie dem Prüfer auch nach der Instanzierung übergeben werden:
$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod')); $valid->setOptions($option); if ($valid->isValid($input)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Wenn zusätzliche Werte an isValid()
übergeben werden, dann
werden diese Werte unmittelbar nach $value
hinzugefügt.
$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod')); $valid->setOptions($option); if ($valid->isValid($input, $additional)) { // Input scheint gültig zu sein } else { // Input ist ungültig }
Wenn der Aufruf zu einem Callback durchgeführt wird, dann wird der Wert der zu
überprüfen ist als erstes Argument an den Callback übergeben gefolgt von allen anderen
Werten die an isValid()
übergeben wurden; alle anderen Optionen
folgen Ihm. Die Anzahl und der Typ der Optionen welche verwendet werden ist nicht
limitiert.
Zend_Validate_CreditCard
erlaubt es zu prüfen ob ein angegebener
Wert eine Kreditkarten Nummer sein könnte.
Eine Kreditkarte enthält verschiedene Elemente an Metadaten, inklusive ein Hologramm, die
Accountnummer, Logo, Ablaufdatum, Sicherheitscode und den Namen des Kreditkartenbesitzers.
Die Algorithmen für die Prüfung der Kombination an Metadaten sind nur der ausgebenden
Firma bekannt, und sollten mit Ihnen zum Zwecke der Zahlung geprüft werden. Trotzdem ist es
oft nützlich zu wissen ob eine akutell angegebene Nummer in den Bereich der möglichen
Nummern fällt bevor so eine Überprüfung durchgeführt wird, und daher
prüft Zend_Validate_CreditCard
einfach ob die angegebene
Kreditkartennummer entspricht.
Für die Fälle in denen man ein Service hat, das tiefere Prüfungen durchführt, bietet
Zend_Validate_CreditCard
auch die Möglichkeit einen Service
Callback anzuhängen der ausgeführt wird sobald die Kreditkartennummer vorbehaltlich als
gültig geprüft wurde; dieser Callback wird dann ausgeführt, und sein Rückgabewert wird
die komplette Gültigkeit erkennen.
Die folgenden Kreditkarteninstitute werden akzeptiert:
-
American Express
China UnionPay
Diners Club Card Blanche
Diners Club International
Diners Club US & Canada
Discover Card
JCB
Laser
Maestro
MasterCard
Solo
Visa
Visa Electron
Ungültige Institute
Die Institute Bankcard und Diners Club enRoute existieren nicht mehr. Deshalb werden Sie als ungültig erkannt.
Switch wurde zu Visa umbenannt und wird daher auch als ungültig erkannt.
Die folgenden Optionen werden für Zend_Validate_CreditCard
unterstützt:
-
service: Ein Callback zu einem Online Service welcher zusätzlich für die Prüfung verwendet wird.
-
type: Der Typ der Kreditkarte der geprüft werden soll. Siehe die folgende Liste an Instituten für Details.
Es gibt verschiedene Kreditkarten Institute wie mit
Zend_Validate_CreditCard
geprüft werden können. Standardmäßig
werden alle bekannte Institute akzeptiert. Siehe das folgende Beispiel:
$valid = new Zend_Validate_CreditCard(); if ($valid->isValid($input)) { // Die Eingabe scheint gültig zu sein } else { // Die Eingabe ist ungültig }
Das oben stehende Beispiel würde alle bekannten Kreditkarten Institute als gültig erkennen.
Manchmal ist es notwendig nur definierte Kreditkarten Institute zu akzeptieren statt
alle; z.B wenn man einen Webshop hat der nur Visa und American Express Karten
akzeptiert. Zend_Validate_CreditCard
erlaubt einem exakt das zu
tun, indem auf genau diese Institute limitiert wird.
Um ein Limit zu verwenden kann man entweder spezifische Institute bei der Initiierung
angeben, oder im nachhinein durch Verwendung von setType()
.
Jede kann verschiedene Argumente verwenden.
Man kann ein einzelnes Institut angeben:
$valid = new Zend_Validate_CreditCard( Zend_Validate_CreditCard::AMERICAN_EXPRESS );
Wenn man mehrere Institute erlauben will, dann kann man diese als Array angeben:
$valid = new Zend_Validate_CreditCard(array( Zend_Validate_CreditCard::AMERICAN_EXPRESS, Zend_Validate_CreditCard::VISA ));
Wie bei allen Prüfern kann man auch ein assoziatives Array an Optionen oder eine
Instanz von Zend_Config
angeben. In diesem Fall muß man die
Institute mit dem Arrayschlüssel type angeben wie hier simuliert:
$valid = new Zend_Validate_CreditCard(array( 'type' => array(Zend_Validate_CreditCard::AMERICAN_EXPRESS) ));
Tabelle 167. Konstanten für Kreditkarten Institute
Institut | Konstante |
---|---|
American Express | AMERICAN_EXPRESS |
China UnionPay | UNIONPAY |
Diners Club Card Blanche | DINERS_CLUB |
Diners Club International | DINERS_CLUB |
Diners Club US & Canada | DINERS_CLUB_US |
Discover Card | DISCOVER |
JCB | JCB |
Laser | LASER |
Maestro | MAESTRO |
MasterCard | MASTERCARD |
Solo | SOLO |
Visa | VISA |
Visa Electron | VISA |
Man kann Institute auch im Nachhinein setzen oder hinzufügen indem die Methoden
setType()
, addType()
und
getType()
verwendet werden.
$valid = new Zend_Validate_CreditCard(); $valid->setType(array( Zend_Validate_CreditCard::AMERICAN_EXPRESS, Zend_Validate_CreditCard::VISA ));
Standard Institute
Wenn bei der Initiierung kein Institut angegeben wird, dann wird
ALL
verwendet, welches alle Institute auf einmal verwendet.
In diesem Fall ist die Verwendung von addType()
sinnlos
weil bereits alle Institute hinzugefügt wurden.
Wie vorher erwähnt prüft Zend_Validate_CreditCard
nur die
Kreditkarten Nummer. Glücklicherweise bieten einige Institute online
APIs welche eine Kreditkarten Nummer durch Verwendung von Algorithmen
prüfen kann, welche nicht öffentlich bekannt sind. Die meisten dieser Services sind zu
bezahlen. Deshalb ist diese Art der Prüfung standardmäßig deaktiviert.
Wenn man auf so eine API zugreift, kann man diese als Addon für
Zend_Validate_CreditCard
verwenden um die Sicherheit der
Prüfung zu erhöhen.
Um das zu tun muss man einfach einen Callback angeben der aufgerufen wird wenn die generische Prüfung erfolgreich war. Das verhindert das die API für ungültige Nummern aufgerufen wird, was wiederum die Performance der Anwendung erhöht.
setService()
setzt ein neues Service und
getService()
gibt das gesetzte Service zurück. Als
Option für die Konfiguration kann man den Arrayschlüssel 'service'
bei der Initiierung verwenden. Für Details über mögliche Optionen kann man unter
Callback nachsehen.
// Die eigene Service Klasse class CcService { public function checkOnline($cardnumber, $types) { // einige online Prüfungen } } // Die Prüfung $service = new CcService(); $valid = new Zend_Validate_CreditCard(Zend_Validate_CreditCard::VISA); $valid->setService(array($service, 'checkOnline'));
Wie man sieht wird die Callback Methode mit der Kreditkarten Nummer als erster Parameter aufgerufen, und die akzeptierten Typen als zweiter Parameter.
Anmerkung
Die Ccnum
Prüfung sollte nicht mehr eingesetzt werden.
Stattdessen sollte man die CreditCard
Prüfung verwenden.
Aus Gründen der Sicherheit sollte man CreditCard statt Ccnum verwenden.
Zend_Validate_Date
erlaubt es zu prüfen ob ein angegebener Wert ein
Datum enthält. Diese Prüfung prüft auch lokalisierte Eingaben.
Die folgenden Optionen werden für Zend_Validate_Date
unterstützt:
-
format: Setzt das Format welches verwendet wird um das Datum zu schreiben.
-
locale: Setzt das Gebietsschema welches verwendet wird um Datumswerte zu prüfen.
Der einfachste Weg um ein Datum zu prüfen ist die Verwendung des Standardmäßigen Datumsformats. Dieses wird verwendet wenn kein Gebietsschema und kein Format angegeben werden.
$validator = new Zend_Validate_Date(); $validator->isValid('2000-10-10'); // Gibt true zurück $validator->isValid('10.10.2000'); // Gibt false zurück
Das standardmäßige Datumsformat für Zend_Validate_Date
ist
'yyyy-MM-dd'.
Zend_Validate_Date
prüft auch Daten welche in einem lokalisierten
Format angegeben werden. Durch Verwendung der Option locale kann
das Gebietsschema definiert werden von dem das Datumsformat für die Prüfung verwendet
werden soll.
$validator = new Zend_Validate_Date(array('locale' => 'de')); $validator->isValid('10.Feb.2010'); // Gibt true zurück $validator->isValid('10.May.2010'); // Gibt false zurück
Die Option locale setzt das standardmäßige Datumsformat. Im obigen Beispiel ist dies 'dd.MM.yyyy' welches als Standardmäßige Datumsformat für 'de' definiert ist.
Zend_Validate_Date
unterstützt auch selbst definierte
Datumsformate. Wenn man solch ein Datum prüfen will muss man die Option
format verwenden.
$validator = new Zend_Validate_Date(array('format' => 'yyyy')); $validator->isValid('2010'); // Gibt true zurück $validator->isValid('May'); // Gibt false zurück
Natürlich kann man format und locale kombinieren. In diesem Fall kann man lokalisierte Monats- oder Tagesnamen verwenden.
$validator = new Zend_Validate_Date(array('format' => 'yyyy MMMM', 'locale' => 'de')); $validator->isValid('2010 Dezember'); // Gibt true zurück $validator->isValid('2010 June'); // Gibt false zurück
Zend_Validate_Db_RecordExists
und
Zend_Validate_Db_NoRecordExists
bieten die Möglichkeit zu testen ob
ein Eintrag in einer angegebenen Tabelle einer Datenbank, mit einem gegebenen Wert,
existiert.
Die folgenden Optionen werden für
Zend_Validate_Db_NoRecordExists
und
Zend_Validate_Db_RecordExists
unterstützt:
-
adapter: Der Datenbank-Adapter welcher für die Suche verwendet wird.
-
exclude: Setzt die Einträge welche von der Suche ausgenommen werden.
-
field: Das Datenbank-Feld in dieser Tabelle welches nach dem Eintrag durchsucht wird.
-
schema: Setzt das Schema welches für die Suche verwendet wird.
-
table: Die Tabelle welche nach dem Eintrag durchsucht wird.
Ein Beispiel der rundsätzlichen Verwendung der Validatoren:
// Prüft ob die Email Adresse in der Datenbank existiert $validator = new Zend_Validate_Db_RecordExists( array( 'table' => 'users', 'field' => 'emailaddress' ) ); if ($validator->isValid($emailaddress)) { // Die Email Adresse scheint gültig zu sein } else { // Die Email Adresse ist ungültig; gib die Gründe an foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
Das oben stehende testet ob eine gegebene Email Adresse in der Datenbanktabelle
vorhanden ist. Wenn kein Eintrag gefunden wird der den Wert von
$emailaddress
in der spezifizierten Spalte hat, wird eine
Fehlermeldung angezeigt.
// Prüft ob der Benutzername in der Datenbank existiert $validator = new Zend_Validate_Db_NoRecordExists( array( 'table' => 'users', 'field' => 'username' ) ); if ($validator->isValid($username)) { // Der Benutzername scheint gültig zu sein } else { // Der Benutzername ist ungültig; gib die Gründe an $messages = $validator->getMessages(); foreach ($messages as $message) { echo "$message\n"; } }
Das oben stehende testet ob ein angegebener Benutzername nicht in der Datenbanktabelle
vorhanden ist. Wenn ein Eintrag gefunden wird, der den der von
$username
in der spezifizierten Spalte enthält, dann wird eine
Fehlermeldung angezeigt.
Zend_Validate_Db_RecordExists
und
Zend_Validate_Db_NoRecordExists
bieten auch die Möglichkeit die
Datenbank zu testen, wobei Teile der Tabelle hiervon ausgenommen werden, entweder indem
eine where Klausel als String angegeben wird, oder ein Array mit den Schlüsseln "field"
und "value".
Wenn ein Array für die Ausnahmeklausel angegeben wird, dann wird der != Operator verwenden. Damit kann der Rest einer Tabelle auf einen Wert geprüft werden bevor ein Eintrag geändert wird (zum Beispiel in einem Formular für ein Benutzerprofil).
// Prüft ob kein anderer Benutzer diesen Benutzernamen hat $user_id = $user->getId(); $validator = new Zend_Validate_Db_NoRecordExists( array( 'table' => 'users', 'field' => 'username', 'exclude' => array( 'field' => 'id', 'value' => $user_id ) ) ); if ($validator->isValid($username)) { // Der Benutzername scheint gültig zu sein } else { // Der Benutzername ist ungültig; zeige den Grund $messages = $validator->getMessages(); foreach ($messages as $message) { echo "$message\n"; } }
Das obige Beispiel prüft die Tabelle um sicherzustellen das keine anderen Einträge existieren bei denen id = $user_id als Wert $username enthalten.
Man kann auch einen String an die Ausnahmeklausel angeben damit man einen anderen Operator als != verwenden kann. Das kann nützlich sein um bei geteilten Schlüsseln zu testen.
$post_id = $post->getId(); $clause = $db->quoteInto('post_id = ?', $category_id); $validator = new Zend_Validate_Db_RecordExists( array( 'table' => 'posts_categories', 'field' => 'post_id', 'exclude' => $clause ); if ($validator->isValid($username)) { // Der Benutzername scheint gültig zu sein } else { // Der Benutzername ist ungültig; die Gründe ausgeben $messages = $validator->getMessages(); foreach ($messages as $message) { echo "$message\n"; } }
Das obige Beispiel prüft die Tabelle 'posts_categories' und stellt sicher das ein
Eintrag der 'post_id' einen Wert hat der $category_id
entspricht.
Man kann auch einen Adapter spezifizieren wenn man die Prüfung instanziiert. Das erlaubt es mit Anwendungen zu arbeiten die mehrere Datenbankadapter verwenden, oder wo kein Standardadapter gesetzt wird. Als Beispiel:
$validator = new Zend_Validate_Db_RecordExists( array( 'table' => 'users', 'field' => 'id', 'adapter' => $dbAdapter ) );
Man kann für die eigene Datenbank bei Adaptern wie PostgreSQL und DB/2 ein Schema spezifizieren indem einfach ein Array mit den Schlüsseln table und schema angegeben wird. Anbei ein Beispiel:
$validator = new Zend_Validate_Db_RecordExists( array( 'table' => 'users', 'schema' => 'my', 'field' => 'id' ) );
Zend_Validate_Digit
prüft ob ein angegebener Wert nur Ziffern
enthält.
Es gibt keine zusätzlichen Optionen für Zend_Validate_Digits
:
Um zu prüfen ob ein angegebener Wert nur Ziffern und keine anderen Zeichen enthält, muss die Prüfung einfach wie in diesem Beispiel gezeigt aufgerufen werden:
$validator = new Zend_Validate_Digits(); $validator->isValid("1234567890"); // Gibt true zurück $validator->isValid(1234); // Gibt true zurück $validator->isValid('1a234'); // Gibt false zurück
Nummern prüfen
Wenn man Nummern oder nummerische Werte prüfen will, muss man darauf achten dass
diese Prüfung nur auf Ziffern prüft. Das bedeutet dass jedes andere Zeichen wie ein
Trennzeichen für Tausender oder ein Komma diese Prüfung nicht bestehen. In diesem
Fall sollte man Zend_Validate_Int
oder
Zend_Validate_Float
verwenden.
Zend_Validate_EmailAddress
erlaubt die Prüfung von Email Adressen.
Der Prüfer teilt zuerst die Email Adresse in lokalen Teil @ hostname und versucht diese mit
bekannten Spezifikationen für Email Adressen und Hostnamen zu prüfen.
Ein Beispiel einer normalen Benutzung ist anbei:
$validator = new Zend_Validate_EmailAddress(); if ($validator->isValid($email)) { // Email Adresse scheint gültig zu sein } else { // Email Adresse ist ungültig, drucke die Gründe hierfür foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
Das prüft die Email Adresse $email
und gibt bei einem Fehler über
getMessages()
eine nützliche Fehlermeldung aus.
Zend_Validate_EmailAddress
unterstützt verschiedene Optionen
welche entweder bei der Initiierung, durch Übergeben eines Arrays mit den betreffenden
Optionen, gesetzt werden können, oder im Nachhinein, durch Verwendung von
setOptions()
. Die folgenden Optionen werden unterstützt:
-
allow: Definiert welche Typen von Domain Namen akzeptiert werden. Diese Option wird in Verbindung mit der hostname Option verwendet um die Hostname Prüfung zu setzen. Für weitere Informationen über mögliche Werte dieser Option sehen Sie bitte unter Hostname und mögliche
ALLOW
* Konstanten. Der Standardwert dieser Option istALLOW_DNS
. -
deep: Definiert ob die MX Records des Server durch eine tiefe Prüfung verifiziert werden sollen. Wenn diese Option auf
TRUE
gesetzt wird, dann werden zusätzlich zum MX Record auch die A, A6 undAAAA
Records verwendet um zu prüfen ob der Server Emails akzeptiert. Der Standardwert dieser Option istFALSE
. -
domain: Definiert ob der Domain Teil geprüft werden soll. Wenn diese Option auf
FALSE
gesetzt wird, dann wird nur der lokale Teil der Email Adresse geprüft. In diesem Fall wird die Hostname Prüfung nicht aufgerufen. Der Standardwert dieser Option istTRUE
. -
hostname: Setzt die Hostname Prüfung mit welcher der Domain Teil der Email Adresse geprüft wird.
-
mx: Definiert ob der MX Record vom Server erkannt werden soll. Wenn diese Option auf
TRUE
definiert wird, dann wird der MX Record verwendet um zu prüfen ob der Server Emails akzeptiert. Der Standardwert dieser Option istFALSE
.
$validator = new Zend_Validate_EmailAddress(); $validator->setOptions(array('domain' => false));
Zend_Validate_EmailAdress
prüft jede gültige Email Adresse mit
RFC2822. Gültige Email Adressen sind zum Beispiel
bob@domain.com, bob+jones@domain.us,
"bob@jones"@domain.com und
"bob jones"@domain.com.
Einige Email Formate werden aktuell nicht geprüft (z.B. Zeilenumbruch Zeichen oder ein "\" Zeichen in einer Email Adresse).
Wenn man will das Zend_Validate_EmailAddress
nur den lokalen Teil
der Email Adresse prüfen soll, und die Prüfung des Hostnamens ausschalten will, kann man
die domain Option auf FALSE
setzen. Das
zwingt Zend_Validate_EmailAddress
den Hostname Teil der Email
Adresse nicht zu prüfen.
$validator = new Zend_Validate_EmailAddress(); $validator->setOptions(array('domain' => FALSE));
Der Teil des Hostnamens einer Email Adresse wird mit Zend_Validate_Host
geprüft. Standardmäßig werden nur DNS Hostnamen in der Form
domain.com
akzeptiert, aber wenn es gewünscht ist, können auch IP
Adressen und lokale Hostnamen auch akzeptiert werden.
Um das zu tun, muß eine Zend_Validate_EmailAddress
Instanz
erstellt werden der ein Parameter übergeben wird, um den Typ des Hostnamens anzugeben
der akzeptiert werden soll. Mehr Details sind in
Zend_Validate_Hostname
inkludiert, zusammen mit einem Beispiel,
wie DNS und lokale Hostnamen, akzeptiert werden wie im Beispiel das anbei steht:
$validator = new Zend_Validate_EmailAddress( Zend_Validate_Hostname::ALLOW_DNS | Zend_Validate_Hostname::ALLOW_LOCAL); if ($validator->isValid($email)) { // Email Adresse scheint gültig zu sein } else { // Email ist ungültig; Gründe ausdrucken foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
Nur weil eine Email Adresse im richtigen Format ist, heißt das notwendigerweise nicht das die Email Adresse aktuell auch existiert. Um dieses Problem zu lösen, kann MX Prüfung verwendet werden um zu prüfen ob ein MX (Email) Eintrag im DNS Eintrag für den Hostnamen der Email existiert. Das zeigt ob der Hostname Emails akzeptiert, sagt aber nicht aus, ob die genaue Email Adresse selbst gültig ist.
Die MX Prüfung ist standardmäßig nicht eingeschaltet. Um die MX Prüfung einzuschalten
kann ein zweiter Parameter an den Zend_Validate_EmailAddress
Konstruktor übergeben werden.
$validator = new Zend_Validate_EmailAddress( array( 'allow' => Zend_Validate_Hostname::ALLOW_DNS, 'mx' => true ) );
Die MX Prüfung unter Windows
In Windows Umgebungen ist die MX Prüfung nicht vorhanden wenn PHP 5.3 oder höher verwendet wird. Unter PHP 5.3 wird die MX Prüfung nicht verwendet, selbst wenn diese in den Optionen aktiviert wurde.
Alternativ kann entweder TRUE
oder FALSE
an
setValidateMx()
übergeben werden um die MX Prüfung ein- oder
auszuschalten.
Durch das einschalten dieser Option werden Netzwerk Funktionen verwendet um zu Prüfen ob ein MX Eintrag am Hostnamen der Email Adresse existiert, welche geprüft werden soll. Vorsicht davor, das hierbei das eigene Skript langsamer wird.
Manchmal gibt die Prüfung auf MX Records FALSE
zurück, selbst wenn
Emails akzeptiert werden. Der Hintergrund dieses Verhaltens ist, das der Server Emails
akzeptieren kann, selbst wenn er keinen MX Record anbietet. In diesem Fall kann er A, A6
oder AAAA
Records anbieten. Um es
Zend_Validate_EmailAddress
zu erlauben auch auf diese anderen
Records zu prüfen, muss man die tiefe MX Prüfung einschalten. Das kann man durch Setzen
der deep Option bei der Initialisierung, oder durch Verwendung von
setOptions()
tun.
$validator = new Zend_Validate_EmailAddress( array( 'allow' => Zend_Validate_Hostname::ALLOW_DNS, 'mx' => true, 'deep' => true ) );
Performance Warnung
Man sollte darauf achten das die Aktivierung der MX Prüfung das Skript langsamer machen wird, weil es Netzwerk Funktionen verwendet. Die Aktivierung der tiefen Prüfung macht das Skript sogar noch langsamer da es im angegebenen Server nach 3 zusätzlichen Typen sucht.
Disallowed IP addresses
Man sollte beachten das die MX Prüfung nur für externe Server akzeptiert wird. Wenn die tiefe MX Prüfung aktiviert wird, dann werden IP Adressen wie 192.168.* oder 169.254.* nicht akzeptiert.
Zend_Validate_EmailAddress
prüft auch internationale Zeichen
prüfen, die in einigen Domains existieren. Dies ist als Unterstützung für
Internationale Domain Namen (IDN) bekannt. Standardmäßig ist das eingeschaltet. Das
kann aber ausgeschaltet werden indem eine Einstellung geändert wird über das interne
Zend_Validate_Hostname
Objekt das innerhalb von
Zend_Validate_EmailAddress
existiert.
$validator->getHostnameValidator->setValidateIdn(false);
Weitere Informationen über die Verwendung von setValidateIdn()
gibt es in der Zend_Validate_Hostname
Dokumentation.
Es sollte darauf geachtet werden das IDNs nur geprüft werden wenn erlaubt ist DNS Hostnamen zu prüfen.
Standardmäßig wird ein Hostname mit einer List von bekannten TLDs geprüft. Das ist
standardmäßig aktiviert, kann aber ausgeschaltet werden indem die Einstellung über das
interne Zend_Validate_Hostname
geändert wird, das innerhalb von
Zend_Validate_EmailAddress
existiert.
$validator->getHostnameValidator->setValidateTld(false);
Mehr Informationen über die Verwendung von setValidateTld()
gibt es in der Zend_Validate_Hostname
Dokumentation.
Es sollte darauf geachtet werden das TLDs nur geprüft werden wenn es auch erlaubt ist DNS Hostnamen zu prüfen.
Zend_Validate_EmailAddress
verwendet auch
Zend_Validate_Hostname
um den Teil des Hostnamens einer
angegebenen Email Adresse zu prüfen. Ab Zend Framework 1.10 kann man Meldungen für
Zend_Validate_Hostname
auch von innerhalb
Zend_Validate_EmailAddress
setzen.
$validator = new Zend_Validate_EmailAddress(); $validator->setMessages(array( Zend_Validate_Hostname::UNKNOWN_TLD => 'Ich kenne die TLD nicht') );
Vor Zend Framework 1.10 musste man die Meldungen einem eigenen
Zend_Validate_Hostname
hinzufügen, und dann diese Prüfung in
Zend_Validate_EmailAddress
setzen um die eigenen Meldungen
zurückzubekommen.
Zend_Validate_Float
erlaubt es zu prüfen ob ein angegebener Wert eine
Gleitkommazahl enthält. Diese Prüfung kann auch lokalisierte Eingaben prüfen.
Die folgenden Optionen werden für Zend_Validate_Float
unterstützt:
-
locale: Setzt das Gebietsschema welches verwendet wird um lokalisierte Gleitkommazahlen zu prüfen.
Der einfachste Weg eine Gleitkommazahl zu prüfen ist die Verwendung der Systemeinstellungen. Wenn keine Option verwendet wird, dann wird das Gebietsschema der Umgebung für die Prüfung verwendet:
$validator = new Zend_Validate_Float(); $validator->isValid(1234.5); // Gibt true zurück $validator->isValid('10a01'); // Gibt false zurück $validator->isValid('1,234.5'); // Gibt true zurück
Im obigen Beispiel wird in der Umgebung das Gebietsschema "en" erwartet.
Oft ist es nützlich in der Lage zu sein lokalisierte Werte zu prüfen. Gleitkommazahlen werden in anderen Ländern oft unterschiedlich geschrieben. Wird zum Beispiel englisch verwendet wird "1.5" geschrieben. Im deutschen wird man "1,5" schreiben und in anderen Sprachen können Gruppierungen verwendet werden.
Zend_Validate_Float
ist in der Lage solche Schreibweisen zu
verwenden. Aber es ist auf das Gebietsschema begrenzt welches man verwendet. Siehe den
folgenden Code:
$validator = new Zend_Validate_Float(array('locale' => 'de')); $validator->isValid(1234.5); // Gibt true zurück $validator->isValid("1 234,5"); // Gibt false zurück $validator->isValid("1.234"); // Gibt true zurück
Bei Verwendung eines Gebietsschemas wird die Eingabe, wie man sehen kann lokalisiert
geprüft. Bei Verwendung einer anderen Schreibweise erhält man ein
FALSE
wenn das Gebietsschema eine andere Schreibweise erzwingt.
Das Gebietsschema kann auch im Nachhinein gesetzt werden indem
setLocale()
verwendet wird, und empfangen indem man
getLocale()
verwendet.
Zend_Validate_GreaterThan
ermöglicht die Überprüfung, ob ein
angegebener Wert größer ist als ein minimaler Grenzwert.
Zend_Validate_GreaterThan unterstützt nur die Überprüfung von Nummern
Es ist zu beachtet, dass Zend_Validate_GreaterThan
nur die
Prüfung von Nummern unterstützt. Zeichenketten oder ein Datum können mit dieser Klasse
nicht geprüft werden.
Die folgenden Optionen werden von Zend_Validate_GreaterThan
unterstützt:
-
min: Setzt den minimalen Grenzwert.
Um zu prüfen ob ein angegebener Wert größer als eine definierte Grenze ist, kann einfach das folgende Beispiel verwendet werden.
$valid = new Zend_Validate_GreaterThan(array('min' => 10)); $value = 11; $return = $valid->isValid($value); // Gibt true zurück
Das obige Beispiel gibt für alle Werte TRUE
zurück die größer als
10 sind.
$valid = new Zend_Validate_GreaterThan(array('min' => 10)); $value = 10; $return = $valid->isValid($value); // Gibt false zurück
Das obige Beispiel gibt für alle Werte FALSE
zurück die kleiner
oder gleich dem Grenzwert sind.
Zend_Validate_Hex
erlaubt es zu prüfen ob ein angegebener Wert nur
hexadezimale Zeichen enthält. Das sint alle Zeichen von 0 bis 9 und
unabhängig von der Schreibweise A bis F. Es gibt keine Begrenzung der
Länge für den Wert welchen man prüfen will.
$validator = new Zend_Validate_Hex(); if ($validator->isValid('123ABC')) { // Der Wert enthält nur Hex Zeichen } else { // Falsch }
Ungültige Zeichen
Alle anderen Zeichen geben false zurück, inklusive Leerzeichen und Kommazeichen. Auch Unicode Nullzeichen und Ziffern von anderen Schriften als Latein werden nicht als gültig erkannt.
Zend_Validate_Hostname
erlaubt die Prüfung von Hostnamen mit einem
Set von bekannten Spezifikationen. Es ist möglich drei verschiedene Typen von Hostnamen zu
Prüfen: einen DNS Hostnamen (z.b. domain.com
), IP
Adressen (z.B. 1.2.3.4), und lokale Hostnamen (z.B. localhost). Standarmäßig werden nur
DNS Hostnamen geprüft.
Die folgenden Optionen werden für Zend_Validate_Hostname
unterstützt:
-
allow: Definiert die Art des Hostnamens welche verwendet werden darf. Siehe Hostname Typen für Details.
-
idn: Definiert ob IDN Domains erlaubt sind oder nicht. Diese Option ist standardmäßig
TRUE
. -
ip: Erlaubt es eine eigene IP Prüfung zu definieren. Diese Option ist standardmäßig eine neue Instanz von
Zend_Validate_Ip
. -
tld: Definiert ob TLDs geprüft werden. Diese Option ist standardmäßig
TRUE
.
Normale Verwendung
$validator = new Zend_Validate_Hostname(); if ($validator->isValid($hostname)) { // Hostname scheint gültig zu sein } else { // Hostname ist ungülig; Gründe dafür ausdrucken foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
Das prüft den Hostnamen $hostname
und wird einen Fehler über
getMessages()
mit einer nützlichen Fehlermeldung
auswerfen.
Es kann gewünscht sein auch IP Adressen, lokale Hostnamen, oder eine Kombination aller
drei erlaubten Typen zu prüfen. Das kann gemacht werden durch die Übergabe eines
Parameters an Zend_Validate_Hostname
wenn dieser initialisiert
wird. Der Parameter sollte ein Integer sein, welcher die Typen von Hostnamen auswählt
die erlaubt sind. Hierfür können die Zend_Validate_Hostname
Konstanten verwendet werden.
Die Zend_Validate_Hostname
Konstanten sind:
ALLOW_DNS
um nur DNS Hostnamen zu erlauben,
ALLOW_IP
um IP Adressen zu erlauben,
ALLOW_LOCAL
um lokale Hostnamen zu erlauben, und
ALLOW_ALL
um alle drei Typen zu erlauben. Um nur IP Adressen zu
prüfen kann das folgende Beispiel verwendet werden:
$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_IP); if ($validator->isValid($hostname)) { // Hostname scheint gültig zu sein } else { // Hostname ist ungülig; Gründe dafür ausdrucken foreach ($validator->getMessages() as $message) { echo "$message\n"; } }
Genau wie die Verwendung von ALLOW_ALL
alle Typen von Hostnamen
akzeptiert, können diese Typen kombiniert werden um Kombinationen zu erlauben. Um zum
Beispiel DNS und lokale Hostnamen zu akzeptieren muß das
Zend_Validate_Hostname
Objekt wie folgt initialisiert werden:
$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS | Zend_Validate_Hostname::ALLOW_IP);
Einige Länder Code Top Level Domains (ccTLDs), wie 'de' (Deutschland), unterstützen
internationale Zeichen in Domain Namen. Diese sind als Internationale Domain Namen
(IDN) bekannt. Diese Domains können mit
Zend_Validate_Hostname
geprüft werden, mit Hilfe von erweiterten
Zeichen die im Prüfprozess verwendet werden.
IDN Domains
Bis jetzt unterstützen mehr als 50 ccTLDs IDN Domains.
Eine IDN Domain zu prüfen ist genauso einfach wie die Verwendung des
standard Hostnamen Prüfers da IDN Prüfung standardmäßig eingeschaltet
ist. Wenn IDN Prüfung ausgeschaltet werden soll, kann das entweder
durch die Übergabe eines Parameters im Zend_Validate_Hostname
Constructor, oder über die setValidateIdn()
Methode gemacht
werden.
Die IDN Prüfung kann ausgeschaltet werden durch die Übergabe eines
zweiten Parameters an den Zend_Validate_Hostname
Constructor auf
die folgende Art und Weise.
$validator = new Zend_Validate_Hostname( array( 'allow' => Zend_Validate_Hostname::ALLOW_DNS, 'idn' => false ) );
Alternativ kann entweder TRUE
oder FALSE
an
setValidateIdn()
übergeben werden, um die
IDN Prüfung ein- oder auszuschalten. Wenn ein IDN
Hostname geprüft wird, der aktuell nicht unterstützt wird, ist sicher das die Prüfung
fehlschlagen wird wenn er irgendwelche internationalen Zeichen hat. Wo keine ccTLD Datei
in Zend/Validate/Hostname
existiert, welche die zusätzlichen
Zeichen definiert, wird eine normale Hostnamen Prüfung durchgeführt.
IDN Prüfung
Es sollte beachtet werden das IDNs nur geprüft werden wenn es erlaubt ist DNS Hostnamen zu prüfen.
Normalerweise wird ein Hostname gegen eine Liste von bekannten
TLDs geprüft. Wenn diese Funktionalität nicht benötigt wird kann
das, auf die gleiche Art und Weise wie die IDN Unterstützung,
ausgeschaltet werden Die TLD Prüfung kann ausgeschaltet werden
indem ein dritter Parameter an den Zend_Validate_Hostname
Constructor übergeben wird. Im folgenden Beispiel wird die IDN
Prüfung durch den zweiten Parameter unterstützt.
$validator = new Zend_Validate_Hostname( array( 'allow' => Zend_Validate_Hostname::ALLOW_DNS, 'idn' => true, 'tld' => false ) );
Alternativ kann entweder TRUE
oder FALSE
übergeben an setValidateTld()
übergeben werden um die
TLD Prüfung ein- oder auszuschalten.
TLD Prüfung
Es sollte beachtet werden das TLDs nur geprüft werden wenn es erlaubt ist DNS Hostnamen zu prüfen.
Zend_Validate_Iban
prüft ob ein angegebener Wert eine
IBAN Nummer sein könnte. IBAN ist die Abkürzung für
"International Bank Account Number".
Die folgenden Optionen werden für Zend_Validate_Iban
unterstützt:
-
locale: Setzt das Gebietsschema welches verwendet wird um das IBAN Format für die Prüfung zu erhalten.
IBAN Nummern sind immer in Bezug zu einem Land. Dies bedeutet dass
unterschiedliche Länder unterschiedliche Formate für Ihre IBAN
Nummern verwenden. Das ist der Grund dafür warum IBAN nummern immer
ein Gebietsschema benötigen. Wenn wir dies wissen, dann wissen wir bereits wie wir
Zend_Validate_Iban
verwenden können.
Wir können das Anwendungsweite Gebietsschema verwenden. Dass bedeutet, wenn keine
Option bei der Instanzierung angegeben wird, das
Zend_Validate_Iban
nach dem Anwendungsweiten Gebietsschema
sucht. Siehe den folgenden Codeabschnitt:
// In der Bootstrap Zend_Registry::set('Zend_Locale', new Zend_Locale('de_AT')); // Im Modul $validator = new Zend_Validate_Iban(); if ($validator->isValid('AT611904300234573201')) { // IBAN scheint gültig zu sein } else { // IBAN ist ungültig }
Anwendungsweites Gebietsschema
Natürlich funktioniert dies nur wenn das Anwendungsweite Gebietsschema in der
Registry vorher gesetzt wurde. Andernfalls wird
Zend_Locale
versuchen das Gebietsschema zu verwenden
welches der Client sendet, oder wenn keines gesendet wurde, das Gebietsschema
der Umgebung. Man sollte darauf achten das dies zu ungewünschtem Verhalten bei
der Prüfung führen kann.
Manchmal ist es nützlich, nur zu prüfen ob der angegebene Wert eine
IBAN Nummer ist oder nicht. Das bedeutet
das man nicht auf ein definiertes Land prüfen will. Das kann getan werden indem ein
FALSE
als Gebietsschema verwendet wird.
$validator = new Zend_Validate_Iban(array('locale' => false)); // Achtung: Man kann ein FALSE auch als einzelnen Parmeter setzen if ($validator->isValid('AT611904300234573201')) { // IBAN scheint gültig zu sein } else { // IBAN ist nicht gültig }
So wird jede IBAN Nummer gültig sein. Es ist zu beachten dass man dies nicht tun sollte wenn man nur Konten von einem einzelnen Land akzeptiert.
Um gegen ein definiertes Land zu prüfen muss man nur das gewünschte Gebietsschema
angeben. Man kann dies mit der locale Option tun, und bei
Verwendung von setLocale()
auch im Nachhinein.
$validator = new Zend_Validate_Iban(array('locale' => 'de_AT')); if ($validator->isValid('AT611904300234573201')) { // IBAN scheint gültig zu sein } else { // IBAN ist ungültig }
Vollständig qualifizierte Gebietsschemas verwenden
Man muss ein vollständig qualifiziertes Gebietsschema verwenden. Andernfalls kann das Land nicht korrekt erkannt werden, da gleiche Sprachen in mehreren Ländern gesprochen werden.
Zend_Validate_Identical
erlaubt es zu prüfen ob ein angegebener Wert
mit einem angegebenen Vergleichswert identisch ist.
Die folgenden Optionen werden für Zend_Validate_Identical
unterstützt:
-
strict: Definiert ob die Prüfung strikt durchgeführt werden soll. Der Standardwert ist
TRUE
. -
token: Setzt den Token gegen den die Eingabe geprüft werden soll.
Um zu prüfen ob zwei Werte identisch sind muss man den originalen Wert als Vergleichswert setzen. Siehe das folgende Beispiel welches zwei Strings vergleicht.
$valid = new Zend_Validate_Identical('original'); if ($valid->isValid($value) { return true; }
Die Prüfung wird nur dann TRUE
zurückgeben wenn beide Werte 100%
identisch sind. In unserem Beispiel wenn $value
'original' ist.
Man kann den gewünschten Token auch im Nachhinein durch Verwendung der Methode
setToken()
setzen und mit getToken()
den aktuell gesetzten Token erhalten.
Natürlich kann Zend_Validate_Identical
nicht nur Strings prüfen,
sondern jeden Variablentyp wie Boolean, Integer, Float, Array oder sogar Objekte. Wie
bereits notiert müssen Vergleichswert und Wert identisch sein.
$valid = new Zend_Validate_Identical(123); if ($valid->isValid($input)) { // Der Wert scheint gültig zu sein } else { // Der Wert ist ungültig }
Vergleich des Typs
Man sollte darauf acht geben das der Typ einer Variable für die Prüfung verwendet wird. Das bedeutet das der String '3' nicht identisch ist mit dem Integerwert 3. Wenn man eine nicht strikte Prüfung durchführen will muss man die strict Option setzen.
Zend_Validate_Identical
unterstützt auch den Vergleich von
Formularelementen. Das kann getan werden indem der Name des Elements als
token verwendet wird. Siehe das folgende Beispiel:
$form->addElement('password', 'elementOne'); $form->addElement('password', 'elementTwo', array( 'validators' => array( array('identical', false, array('token' => 'elementOne')) ) ));
Indem der Elementname vom ersten Element als token für das zweite Element verwendet wird, prüft der Prüfer ob das zweite Element gleich dem ersten Element ist. Im Falle das der Benutzer keine zwei identischen Werte eingegeben hat, erhält man einen Prüffehler.
Wie vorher erwähnt prüft Zend_Validate_Identical
die Token
strikt. Man kann dieses Verhalten ändern indem die strict Option
verwendet wird. Der Standardwert für diese Eigenschaft ist TRUE
.
$valid = new Zend_Validate_Identical(array('token' => 123, 'strict' => FALSE)); $input = '123'; if ($valid->isValid($input)) { // Die Eingabe scheint gültig zu sein } else { // Die Eingabe ist ungültig }
Der Unterschied zum vorhergehenden Beispiel besteht darin dass die Prüfung in diesem
Fall TRUE
zurückgibt, selbst wenn man einen Integerwert mit einem
String prüft solange der Inhalt identisch aber nicht vom gleichen Typ ist.
Der Bequemlichkeit halber kann man auch setStrict()
und
getStrict()
verwenden.
Wie alle anderen Prüfungen unterstützt Zend_Validate_Identical
auch die Verwendung von Konfigurationseinstellungen als Eingabe Parameter. Das
bedeutet das man den Prüfer mit einem Zend_Config
Objekt
konfigurieren kann.
Aber das führt zu einem weiteren Fall den man berücksichtigen muss. Wenn man ein Array als Vergleichswert verwendet, dann sollte man dieses in einen 'token' Schlüssel einhüllen wenn dieses nur ein Element enthält.
$valid = new Zend_Validate_Identical(array('token' => 123)); if ($valid->isValid($input)) { // Der Wert scheint gültig zu sein } else { // Der Wert ist ungültig }
Das oben stehende Beispiel prüft den Integerwert 123. Der Grund für diesen speziellen Fall ist, dass man den Token der verwendet werden soll, durch Angabe des 'token' Schlüssels, konfigurieren kann.
Wenn der eigene Vergleichswert nur ein Element enthält, und dieses Element 'token' heißt dann muss man dieses, wie im oben stehenden Beispiel gezeigt, einhüllen.
$valid = new Zend_Validate_Identical(array('token' => array('token' => 123))); if ($valid->isValid($input)) { // Der Wert scheint gültig zu sein } else { // Der Wert ist ungültig }
Zend_Validate_InArray
erlaubt es zu prüfen ob ein gegebener Wert
in einem Array enthalten ist. Er ist auch in der Lage mehrdimensionale Arrays zu prüfen.
Die folgenden Optionen werden für Zend_Validate_InArray
unterstützt:
-
haystack: Setzt den Haystack für die Prüfung.
-
recursive: Definiert ob die Prüfung rekursiv durchgeführt werden soll. Diese Option ist standardmäßig
FALSE
. -
strict: Definiert ob die Prüfung strikt durchgeführt werden soll. Diese Option ist standardmäßig
FALSE
.
Der einfachste Weg ist es, das Array welches durchsucht werden soll, bei der Initiierung anzugeben:
$validator = new Zend_Validate_InArray(array('key' => 'value', 'otherkey' => 'othervalue')); if ($validator->isValid('value')) { // Wert gefunden } else { // Wert nicht gefunden }
Das verhält sich genauso wie PHP's
in_array()
Methode.
Anmerkung
Standardmäßig ist diese Prüfung nicht strikt noch kann Sie mehrdimensionale Arrays prüfen.
Natürlich kann man das Array gegen das geprüft werden soll auch im Nachhinein durch
Verwendung der setHaystack()
Methode angegeben werden.
getHaystack()
gibt das aktuell gesetzte Haystack Array zurück.
$validator = new Zend_Validate_InArray(); $validator->setHaystack(array('key' => 'value', 'otherkey' => 'othervalue')); if ($validator->isValid('value')) { // Wert gefunden } else { // Wert nicht gefunden }
Wie vorher erwähnt kann man auch eine Strikte Prüfung im Array durchführen. Standardmäßig würde kein Unterschied zwischen dem Integerwert 0 und dem String "0" sein. Wenn eine strikte Prüfung durchgeführt wird dann wird dieser Unterschied auch geprüft und nur gleiche Typen werden akzeptiert.
Eine strikte Prüfung kann auch auf zwei verschiedenen Wegen durchgeführt werden. Bei der Initiierung und durch Verwendung einer Methode. Bei der Initiierung muß hierfür ein Array mit der folgenden Struktur angegeben werden:
$validator = new Zend_Validate_InArray( array( 'haystack' => array('key' => 'value', 'otherkey' => 'othervalue'), 'strict' => true ) ); if ($validator->isValid('value')) { // Wert gefunden } else { // Wert nicht gefunden }
Der haystack Schlüssel enthält das eigene Array das für die
Prüfung verwendet wird. Durch das Setzen des script Schlüssels
auf TRUE
wird die Prüfung so durchgeführt, das der Typ strikt
geprüft wird.
Natürlich kann man auch die setStrict()
Methode verwenden
um diese Einstellung im Nachhinein zu ändern und getStrict()
um den aktuell gesetzten Status zu erhalten.
Anmerkung
Es ist zu beachten das die strict Einstellung standardmäßig
FALSE
ist.
Zusätzlich zu PHP's in_array()
Methode kann
diese Prüfung auch verwendet werden um Mehrdimensionale Arrays zu prüfen.
Um mehrdimensionale Array zu prüfen muß die recursive Option gesetzt werden.
$validator = new Zend_Validate_InArray( array( 'haystack' => array( 'firstDimension' => array('key' => 'value', 'otherkey' => 'othervalue'), 'secondDimension' => array('some' => 'real', 'different' => 'key')), 'recursive' => true ) ); if ($validator->isValid('value')) { // Wert gefunden } else { // Wert nicht gefunden }
Das eigene Array wird das rekursiv geprüft um zu sehen ob der angegebene Wert enthalten
ist. Zusätzlich kann setRecursive()
verwendet werden um diese
Option im Nachhinein zu setzen und getRecursive()
um Ihn zu
erhalten.
$validator = new Zend_Validate_InArray( array( 'firstDimension' => array('key' => 'value', 'otherkey' => 'othervalue'), 'secondDimension' => array('some' => 'real', 'different' => 'key') ) ); $validator->setRecursive(true); if ($validator->isValid('value')) { // Wert gefunden } else { // kein Wert gefunden }
Standardwert für die Rekursion
Standardmäßig ist die rekursive Prüfung ausgeschaltet.
Optionsschlüssel im Haystack
Wenn man die Schlüssel 'haystack', 'strict' oder 'recursive' im eigenen Haystack verwenden, dann muß man diese mit dem haystack Schlüssel einhüllen.
Zend_Validate_Int
prüft ob ein angegebener Wert ein Integer
(Ganzzahl) ist. Auch lokalisierte Integerwerte werden erkannt und können geprüft werden.
Die folgenden Optionen werden für Zend_Validate_Int
unterstützt:
-
locale: Setzt das Gebietsschema welches verwendet wird um lokalisierte Integerwerte zu prüfen.
Der einfachste Weg um einen Integerwert zu prüfen ist die Verwendung der Systemeinstellungen. Wenn keine Optionen angegeben werden, dann wird das Gebietsschema der Umgebung für die Prüfung verwendet:
$validator = new Zend_Validate_Int(); $validator->isValid(1234); // Gibt true zurück $validator->isValid(1234.5); // Gibt false zurück $validator->isValid('1,234'); // Gibt true zurück
Um obigen Beispiel haben wir angenommen das unsere Umgebung auf "en" als Gebietsschema gesetzt ist. Wie man im dritten Beispiel sieht wird auch die Gruppierung erkannt.
Oft ist es nützlich dazu in der Lage zu sein lokalisierte Werte zu prüfen. Integerwerte werden in anderen Ländern oft unterschiedlich geschrieben. Zum Beispiel kann man im Englischen "1234" oder "1,234" schreiben. Beides sind Integerwerte, aber die Gruppierung ist optional. Im Deutschen kann man zum Beispiel "1.234" schreiben und im Französischen "1 234".
Zend_Validate_Int
ist in der Lage solche Schreibweisen zu prüfen.
Das bedeutet, das es nicht einfach das Trennzeichen entfernt, sondern auch prüft ob das
richtige Trennzeichen verwendet wird. Siehe den folgenden Code:
$validator = new Zend_Validate_Int(array('locale' => 'de')); $validator->isValid(1234); // Gibt true zurück $validator->isValid("1,234"); // Gibt false zurück $validator->isValid("1.234"); // Gibt true zurück
Wie man sieht wird die Eingabe, bei Verwendung eines Gebietsschemas, lokalisiert
geprüft. Bei Verwendung der englischen Schreibweise erhält man
FALSE
wenn das Gebietsschema eine andere Schreibweise erzwingt.
Das Gebietsschema kann auch im Nachhinein gesetzt werden indem
setLocale()
verwendet wird, und empfangen indem man
getLocale()
verwendet.
Zend_Validate_Isbn
erlaubt es einen
ISBN-10 oder ISBN-13 Wert zu prüfen.
Die folgenden Optionen werden für Zend_Validate_Isbn
unterstützt:
-
separator: Definiert das erlaubte Trennzeichen für die ISBN Nummer. Diese ist standardmäßig ein leerer String.
-
type: Definiert den erlaubten Typ an ISBN Nummern. Dieser ist standardmäßig
Zend_Validate_Isbn::AUTO
. Für Details sollte in diesem Abschnitt nachgesehen werden.
Ein einfaches Verwendungsbeispiel ist anbei zu finden:
$validator = new Zend_Validate_Isbn(); if ($validator->isValid($isbn)) { // ISBN gültig } else { // ISBN ungültig }
Das prüft jeden ISBN-10 und ISBN-13 Wert ohne Trennzeichen.
Ein Beispiel für die Begrenzung auf einen ISBN Typ ist anbei zu finden:
$validator = new Zend_Validate_Isbn(); $validator->setType(Zend_Validate_Isbn::ISBN13); // ODER $validator = new Zend_Validate_Isbn(array( 'type' => Zend_Validate_Isbn::ISBN13, )); if ($validator->isValid($isbn)) { // Das ist ein gültiger ISBN-13 Wert } else { // Das ist ein ungültiger ISBN-13 Wert }
Das vorherige prüft nur auf ISBN-13 Werte.
Folgende gültige Typen sind vorhanden:
-
Zend_Validate_Isbn::AUTO
(default) -
Zend_Validate_Isbn::ISBN10
-
Zend_Validate_Isbn::ISBN13
Ein Beispiel für die Begrenzung auf ein Trennzeichen ist anbei zu finden:
$validator = new Zend_Validate_Isbn(); $validator->setSeparator('-'); // ODER $validator = new Zend_Validate_Isbn(array( 'separator' => '-', )); if ($validator->isValid($isbn)) { // Das ist eine gültige ISBN mit Trennzeichen } else { // Das ist eine ungültige ISBN mit Trennzeichen }
Werte ohne Trennzeichen
Es ist zu beachten das dies FALSE
zurückgibt wenn
$isbn
kein Trennzeichen oder einen
ungültigen ISBN Wert enthält.
Gültige Separatoren sind:
"" (Leer) (Standardwert)
"-" (Bindestrich)
" " (Leerzeichen)
Zend_Validate_Ip
erlaubt es zu Prüfen ob ein gegebener Wert eine IP
Adresse ist. Er unterstützt den IPv4 und auch den IPv6 Standard.
Die folgenden Optionen werden für Zend_Validate_Ip
unterstützt:
-
allowipv4: Definiert ob die Prüfung IPv4 Adressen erlaubt. Diese Option ist standardmäßig
TRUE
. -
allowipv6: Definiert ob die Prüfung IPv6 Adressen erlaubt. Diese Option ist standardmäßig
TRUE
.
Ein einfaches Beispiel für die Verwendung ist anbei:
$validator = new Zend_Validate_Ip(); if ($validator->isValid($ip)) { // IP scheint gültig zu sein } else { // IP ist ungültig; Gründe ausgeben }
Ungültige IP Adressen
Es ist zu beachten das Zend_Validate_Ip
nur IP Adressen
prüft. Adressen wie 'mydomain.com
' oder
'192.168.50.1/index.html
' sind keine gültigen IP Adressen. Sie
sind entweder Hostnamen oder gültige URLs, aber keine IP
Adressen.
IPv6 Prüfung
Zend_Validate_Ip
prüft IPv6 Adressen mit einer Regex. Der
Grund ist, dass die Filter und Methoden von PHP der
RFC nicht folgen. Viele andere vorhandene Klassen folgen Ihr auch
nicht.
Manchmal ist es nützlich nur eines der unterstützten Formate zu prüfen. Zum Beispiel wenn das eigene Netzwert nur IPv4 unterstützt. In diesem Fall wäre es sinnlos IPv6 in der Prüfung zu erlauben.
Um Zend_Validate_Ip
auf ein Protokoll zu begrenzen kann man die
Optionen allowipv4 oder allowipv6 auf
FALSE
setzen. Man kann das durchführen indem die Option entweder im
Constructor angegeben wird, oder indem setOptions()
im
Nachhinein verwendet wird.
$validator = new Zend_Validate_Ip(array('allowipv6' => false); if ($validator->isValid($ip)) { // IP scheint eine gültige IPv4 Adresse zu sein } else { // IP ist keine IPv4 Adresse }
Standard Verhalten
Das Standardverhalten dem Zend_Validate_Ip
folgt, ist es
beide Standards zu erlauben.
Zend_Validate_LessThan
erlaubt es zu prüfen ob ein angegebener Wert
kleiner als ein maximaler Grenzwert ist. Das ist der Cousine von
Zend_Validate_GreaterThan
.
Zend_Validate_LessThan unterstützt nur die Prüfung von Nummern
Es sollte beachtet werden das Zend_Validate_LessThan
nur die
Prüfung von Nummern unterstützt. Strings oder ein Datum können mit dieser Prüfung nicht
geprüft werden.
Die folgenden Optionen werden für Zend_Validate_LessThan
unterstützt:
-
max: Setzt den maximal erlaubten Wert.
Um zu prüfen ob ein angegebener Wert kleiner als eine definierte Grenz ist kann einfach das folgende Beispiel verwendet werden.
$valid = new Zend_Validate_LessThan(array('max' => 10)); $value = 10; $return = $valid->isValid($value); // Gibt true zurück
Das obige Beispiel gibt für alle Werte TRUE
zurück die 10 sind oder
kleiner als 10.
Dieser Prüfer erlaubt es zu prüfen ob ein angegebener Wert nicht leer ist. Das ist oft nützlich wenn man mit Formular Elementen oder anderen Benutzereingaben arbeitet, und man sicherstellen will das den benötigten Elementen Werte zugeordnet wurden.
Die folgenden Optionen werden für Zend_Validate_NotEmpty
unterstützt:
-
type: Setzt den Typ der Prüfung welcher durchgeführt wird. Für Details sollte in diesem Abschnitt nachgesehen werden.
Standardmäßig arbeitet diese Prüfung anders als man es laut PHP's
empty()
Funktion erwarten würde. Im speziellen evaluiert diese
Prüfung den den Integer 0 und den String '0'
als leer.
$valid = new Zend_Validate_NotEmpty(); $value = ''; $result = $valid->isValid($value); // gibt false zurück
Unterschiedliches Standardverhalten zu PHP
Ohne Angabe einer Konfiguration ist das Verhalten von
Zend_Validate_NotEmpty
anders als das von
PHP.
Einige Projekte haben andere Ansichten davon was als "leerer" Wert angesehen wird: ein
String der nur Leerzeichen enthält könnte als leer angesehen werden, oder
0 könnte als nicht leer angesehen werden (speziell für boolsche
Sequenzen). Um den unterschiedlichen Notwendigkeiten gerecht zu werden erlaubt es
Zend_Validate_NotEmpty
die Typen zu konfigurieren welche als
leer angesehen werden und jene die es nicht werden.
Die folgenden Typen können behandelt werden:
-
boolean: Gibt
FALSE
zurück wenn der boolsche WertFALSE
ist. -
integer: Gibt
FALSE
zurück wenn ein Integerwert 0 angegeben ist. Standardmäßig ist diese Prüfung nicht aktiviert und gibt bei jedem IntegerwertTRUE
zurück. -
float: Gibt
FALSE
zurück wenn die Gleitkommazahl 0.0 angegeben ist. Standardmäßig ist diese Prüfung nicht aktiviert und gibt bei jeder GleitkommazahlTRUE
zurück. -
string: Gibt
FALSE
zurück wenn ein leerer String '' angegeben wird. -
zero: Gibt
FALSE
zurück wenn das einzelne Zeichen Null ('0') angegeben wird. -
empty_array: Gibt
FALSE
zurück wenn ein leeres array angegeben wird. -
null: Gibt
FALSE
zurück wenn einNULL
Wert angegeben wird. -
php: Gibt bei den gleichen Gründen
FALSE
zurück wo auch PHP's Methodeempty()
TRUE
zurückgeben würde. -
space: Gibt
FALSE
zurück wenn ein String angegeben wird der nur Leerzeichen enthält. -
object: Gibt
TRUE
zurück wenn ein Objekt angegeben wurde.FALSE
wird zurückgegeben wenn object nicht erlaubt, aber ein Objekt angegeben wurde. -
object_string: Gibt
FALSE
zurück wenn ein Objekt angegeben wurde und dessen__toString()
Methode einen leeren String zurückgibt. -
object_count: Gibt
FALSE
zurück wenn ein Objekt angegeben wurde, es einCountable
Interface hat und seine Anzahl 0 ist. -
all: Gibt bei allen oben stehenden Typen
FALSE
zurück.
Alle anderen Werte geben standardmäßig TRUE
zurück.
Es gibt verschiedene Wege um zu wählen welche der obigen Typen geprüft werden sollen. Man kann ein oder mehrere Typen angeben und Sie hinzufügen, man kann ein Array angeben, man kann Konstanten verwenden, oder man gibt einen textuellen String an. Siehe auch die folgenden Beispiele:
// Gibt bei 0 false zurück $validator = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::INTEGER); // Gibt bei 0 oder '0' false zurück $validator = new Zend_Validate_NotEmpty( Zend_Validate_NotEmpty::INTEGER + Zend_NotEmpty::ZERO ); // Gibt bei 0 oder '0' false zurück $validator = new Zend_Validate_NotEmpty(array( Zend_Validate_NotEmpty::INTEGER, Zend_Validate_NotEmpty::ZERO )); // Gibt bei 0 oder '0' false zurück $validator = new Zend_Validate_NotEmpty(array( 'integer', 'zero', ));
Man kann auch eine Instanz von Zend_Config
angeben um die
gewünschten Typen zu setzen. Um Typen nach der Instanzierung zu setzen kann die
Methode setType()
verwendet werden.
Zend_Validate_PostCode
erlaubt es zu eruieren ob ein angegebener
Wert eine gültige Postleitzahl ist. Postleitzahlen sind spezifisch für Städte und in einigen
Gebietsschemata auch als ZIP Codes bezeichnet.
Zend_Validate_PostCode
kennt mehr als 160 unterschiedliche Formate
für Postleitzahlen. Um das richtige Format auszuwählen gibt es 2 Wege. Man kann entweder
ein voll qualifiziertes Gebietsschema verwenden, oder ein eigenes Format manuall setzen.
Die Verwendung eines Gebietsschemas ist bequemer da Zend Framework bereits die
entsprechenden Formate für Postleitzahlen für jedes Gebietsschema kennt; aber muss man
ein voll qualifiziertes Gebietsschema verwenden (eines das eine Region spezifiziert) damit
es funktioniert. Das Gebietsschema "de" zum Beispiel ist zwar ein Gebietsschema, kann aber
nicht mit Zend_Validate_PostCode
verwendet werden da es keine
Region enthält; "de_AT" andererseits würde ein gültiges Gebietsschema sein da es den
Region Code spezifiziert ("AT", für Österreich).
$validator = new Zend_Validate_PostCode('de_AT');
Wenn man das Gebietsschema nicht selbst setzt, dann verwendet
Zend_Validate_PostCode
das anwendungsweit gesetzte Gebietsschema,
oder wenn keines vorhanden ist, das Gebietsschema welches von
Zend_Locale
zurückgegeben wird.
// Anwendungsweites Gebietsschema in der Bootstrap $locale = new Zend_Locale('de_AT'); Zend_Registry::set('Zend_Locale', $locale); $validator = new Zend_Validate_PostCode();
Man kann das Gebietsschema auch im Nachhinein ändern, indem man
setLocale()
aufruft. Und natürlich kann man das aktuelle
Gebietsschema erhalten indem getLocale()
aufgerufen wird.
$validator = new Zend_Validate_PostCode('de_AT'); $validator->setLocale('en_GB');
Postleitzahlen Formate selbst sind einfache Regular Expression Strings. Wenn das
internationale Postleitzahlen Format, welches durch das Setzen des Gebietsschemas verwendet
wird, den eigenen Bedüfnissen nicht entspricht, dann kann man ein Format auch manuell setzen
indem setFormat()
aufgerufen wird.
$validator = new Zend_Validate_PostCode('de_AT'); $validator->setFormat('AT-\d{5}');
Konventionen für selbst definierte Formate
Wenn selbst definierte Formate verwendet werden sollten die Start- ('/^') und Endetags ('$/') nicht angegeben werden. Sie werden automatisch hinzugefügt.
Man sollte darauf achtgeben das Postleitzahlen Werte immer auf einer strikte Art geprüft werden. Das bedeutet das Sie alleinstehend geschrieben werden müssen, ohne zusätzliche Zeichen, wenn diese nicht durch das Format abgedeckt werden.
Grundsätzlich kann man dem Contructor von Zend_Validate_PostCode
entweder ein Zend_Locale
Objekt, oder einen String der ein voll
qualifiziertes Gebietsschema repräsentiert, angeben.
$validator = new Zend_Validate_PostCode('de_AT'); $validator = new Zend_Validate_PostCode($locale);
Zusätzlich kann man dem Contructor entweder ein Array oder ein
Zend_Config
Objekt übergeben. Wenn man das tut, muss man
entweder den Schlüssel "locale" oder "format" verwenden; diese werden verwendet um die
betreffenden Werte im Prüfobjekt zu setzen.
$validator = new Zend_Validate_PostCode(array( 'locale' => 'de_AT', 'format' => 'AT_\d+' ));
Diese Prüfung erlaubt es zu prüfen ob ein angegebener String einer definierten Regular Expression entspricht.
Die folgenden Optionen werden für Zend_Validate_Regex
unterstützt:
-
pattern: Setzt das Pattern der Regular Expression für diese Prüfung.
Die Prüfung mit Regular Expressions erlaubt es komplizierte Prüfungen durchzuführen, ohne das eine eigene Prüfung geschrieben werden muss. Die Verwendung von Regular Expressions ist relativ üblich und einfach. Sehen wir uns ein Beispiel an:
$validator = new Zend_Validate_Regex(array('pattern' => '/^Test/'); $validator->isValid("Test"); // Gibt true zurück $validator->isValid("Testing"); // Gibt true zurück $validator->isValid("Pest"); // Gibt false zurück
Wie man sehen kann hat das Pattern welches anzugeben ist die gleiche Syntax wie für
preg_match()
. Für Details über Regular Expressions sollte man
einen Blick in PHP's Handbuch
über die PCRE Pattern Syntax werfen.
Es ist auch möglich andere Pattern im Nachhinein zu setzen indem
setPattern()
verwendet wird, und das aktuell gesetzte Pattern
mit getPattern()
erhalten.
$validator = new Zend_Validate_Regex(array('pattern' => '/^Test/'); $validator->setPattern('ing$/'); $validator->isValid("Test"); // Gibt false zurück $validator->isValid("Testing"); // Gibt true zurück $validator->isValid("Pest"); // Gibt false zurück
Die folgenden Prüfungen entsprechen dem Sitemap XML Protokoll.
Prüft ob ein String gültig ist um Ihn als 'changefreq' Element in einem Sitemap XML Dokument zu verwenden. Gültige Elemente sind: 'always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', oder 'never'.
Gibt TRUE
zurück wenn und nur wenn der Wert ein String ist und mit
einer der oben spezifizierten Frequenzen übereinstimmt.
Prüft ob ein String gültig ist um Ihn als 'lastmod' Element in einem Sitemap XML Dokument zu verwenden. Das lastmod Element sollte einen W3C Datumsstring enthalten, und optional Informationen über die Zeit enthalten.
Gibt TRUE
zurück wenn, und nur wenn, der angegebene Wert ein String
und in Bezug auf das Prokoll gültig ist.
Beispiel 931. Sitemap Lastmod Prüfung
$validator = new Zend_Validate_Sitemap_Lastmod(); $validator->isValid('1999-11-11T22:23:52-02:00'); // true $validator->isValid('2008-05-12T00:42:52+02:00'); // true $validator->isValid('1999-11-11'); // true $validator->isValid('2008-05-12'); // true $validator->isValid('1999-11-11t22:23:52-02:00'); // false $validator->isValid('2008-05-12T00:42:60+02:00'); // false $validator->isValid('1999-13-11'); // false $validator->isValid('2008-05-32'); // false $validator->isValid('yesterday'); // false
Prüft ob ein String für die Verwendung als 'loc' Element in einem Sitemap
XML Dokument gültig ist. Er verwendet intern
Zend_Form::check()
. Mehr darüber kann man unter URI Prüfung lesen.
Prüft ob ein Wert für die Verwendung als 'priority' Element in einem Sitemap XML Dokument gültig ist. Der Wert sollte ein Dezimalwert zwischen 0.0 und 1.0 sein. Diese Prüfung akzeptiert sowohl nummerische Werte als auch Stringwerte.
Beispiel 932. Sitemap Priority Prüfung
$validator = new Zend_Validate_Sitemap_Priority(); $validator->isValid('0.1'); // true $validator->isValid('0.789'); // true $validator->isValid(0.8); // true $validator->isValid(1.0); // true $validator->isValid('1.1'); // false $validator->isValid('-0.4'); // false $validator->isValid(1.00001); // false $validator->isValid(0xFF); // false $validator->isValid('foo'); // false
Diese Prüfung erlaubt es zu prüfen ob ein angegebener String eine definierte Länge besitzt.
Zend_Validate_StringLength unterstützt nur die Prüfung von Strings
Es ist zu beachten das Zend_Validate_StringLength
nur die Prüfung
von Strings unterstützt. Integer, Floats, Datumswerte oder Objekte können mit dieser
Prüfung nicht überprüft werden.
Die folgenden Optionen werden von Zend_Validate_StringLength
unterstützt:
-
encoding: Setzt die Kodierung von
ICONV
welche für den String verwendet wird. -
min: Setzt die erlaubte Mindestlänge für einen String.
-
max: Setzt die erlaubte Maximallänge für einen String.
Standardmäßig prüft diese Prüfung ob ein Wert zwischen min und
max ist. Aber für min ist der Standardwert
0 und für max ist er
NULL
, was unlimitiert bedeutet.
Deshalb prüft diese Prüfung standardmäßig, ohne das eine Option angegeben wurde, nur ob die Eingabe ein String ist.
Um die maximal erlaubte Länge eines Strings zu begrenzen muss man die Eigenschaft max setzen. Sie akzeptiert einen Integerwert als Eingabe.
$validator = new Zend_Validate_StringLength(array('max' => 6)); $validator->isValid("Test"); // Gibt true zurück $validator->isValid("Testing"); // Gibt false zurück
Man kann die maximal erlaubte Länge auch im Nachhinein setzen indem die
setMax()
Methode verwendet wird. Und
getMax()
um die aktuelle maximale Grenze zu erhalten.
$validator = new Zend_Validate_StringLength(); $validator->setMax(6); $validator->isValid("Test"); // Gibt true zurück $validator->isValid("Testing"); // Gibt false zurück
Um die mindestens benötigte Länge eines Strings zu begrenzen muss man die Eigenschaft min setzen. Sie akzeptiert einen Integerwert als Eingabe.
$validator = new Zend_Validate_StringLength(array('min' => 5)); $validator->isValid("Test"); // Gibt false zurück $validator->isValid("Testing"); // Gibt true zurück
Man kann die mindestens benötigte Länge auch im Nachhinein setzen indem die
setMin()
Methode verwendet wird. Und
getMin()
um die aktuelle Mindestgrenze zu erhalten.
$validator = new Zend_Validate_StringLength(); $validator->setMin(5); $validator->isValid("Test"); // Gibt false zurück $validator->isValid("Testing"); // Gibt true zurück
Manchmal ist es notwendig einen String zu erhalten der eine maximal definierte Länge, aber auch eine Mindestlänge hat. Wenn man, zum Beispiel, eine Textbox hat in welcher der Benutzer seinen Namen angeben kann, könnte man den Namen auf maximal 30 Zeichen begrenzen. Aber man will auch sicher gehen das er seinen Namen angegeben hat. Deshalb setzt man die zumindest benötigte Länge auf 3 Zeichen. Siehe das folgende Beispiel:
$validator = new Zend_Validate_StringLength(array('min' => 3, 'max' => 30)); $validator->isValid("."); // Gibt false zurück $validator->isValid("Test"); // Gibt true zurück $validator->isValid("Testing"); // Gibt true zurück
Eine kleinere Maximalgrenze als die Mindestgrenze setzen
Wenn man versucht eine kleinere Maximalgrenze zu setzen als der aktuelle Mindestwert, oder eine größere Mindestgrenze als den aktuellen Maximalwert, dann wird eine Exception geworfen.
Strings verwenden immer eine Kodierung. Selbst wenn man keine explizite Kodierung verwendet, dann verwendet PHP eine. Wenn die eigene Anwendung eine andere Kodierung verwendet als PHP selbst, dann sollte man eine Kodierung setzen.
Man kann eine eigene Kodierung bei der Instanzierung mit der
encoding Option setzen, oder indem die
setEncoding()
Methode verwendet wird. Wir nehmen an das die
eigene Installation ISO verwendet und die Anwendung auf
ISO gesetzt ist. In diesem Fall sieht man das folgende
Verhalten.
$validator = new Zend_Validate_StringLength( array('min' => 6) ); $validator->isValid("Ärger"); // Gibt false zurück $validator->setEncoding("UTF-8"); $validator->isValid("Ärger"); // Gibt true zurück $validator2 = new Zend_Validate_StringLength( array('min' => 6, 'encoding' => 'UTF-8') ); $validator2->isValid("Ärger"); // Gibt true zurück
Wenn die eigene Installation und die Anwendung also unterschiedliche Kodierungen verwenden, dann sollte man immer selbst eine Kodierung setzen.