Validierung von URLs mit Zend_Validate

Dieser Beitrag beschreibt kurz wie man mit Zend_Validate prüfen kann, ob eine URL / URI syntaktisch korrekt und die verlinkte Ressource erreichbar ist.

Aufbau einer URL prüfen

Ein eigenständiger Validator ist im Zend Framework nicht vorhanden welcher den Aufbau einer URL / URI prüft. Jedoch bietet Zend_URI mit der Methode check() hier eine entsprechende Funktionalität an. Auf diese greifen wir in einem selbst geschriebenen Validator zurück:

class Validator_Uri extends Zend_Validate_Abstract {
	const INVALID_URI = 'invalidUri';
	protected $_messageTemplates = array (self::INVALID_URI => "'%value%' is not a valid URI" );

	public function isValid($value) {
		$this->_setValue ($value);

		if (! Zend_Uri::check ($value)) {
			$this->_error ( self::INVALID_URI );
			return false;
		}

		return true;
	}
}

Erreichbarkeit einer URL prüfen

Es ist nicht nur wichtig, dass die Ressourcenangabe in Ihrem Aufbau korrekt ist, sondern auch, dass sich dahinter ein erreichbares Objekt (Webseite, Bild, PDF etc.) befindet.
Mit Hilfe der PHP-Funktion get_headers prüfen wir den Antwort-Header auf Erfolg (200 OK). Mit Hilfe des @ unterdrücken wir eine Fehler-Ausgabe von PHP, wenn der String an get_headers keine URL sein sollte:

class Validator_Uri_Reachable extends Zend_Validate_Abstract {
	const URI_REACHABLE = 'uriReachable';
	protected $_messageTemplates = array (self::URI_REACHABLE => "'%value%' not reachable" );

	public function isValid($value) {
		$this->_setValue ( $value );

		$headers = @get_headers ( $value );
		if (! preg_match ( '/200 OK/', $headers [0] )) {
			$this->_error ();
			return false;
		}

		return true;
	}
}

Entsprechend kann dann in einem Zend-Formular z.B. eine Homepageadresse geprüft werden:

$hpUrl = new Zend_Form_Element_Text ( 'hpUrl' );
$hpUrl->setLabel ( 'Homepage:' )
			  ->setDescription ( 'Ihre Homepage- oder Blog-Adresse' );
			  ->setAttrib ( 'value', 'http://' )
			  ->addValidator ( new Validator_Uri() )
			  ->addValidator ( new Validator_Uri_Reachable() )

Weitere Links:

Share
  1. Kleine Korrektur

    if (! preg_match ( ‘/200 OK/’, $headers [7] )) {
    $this->_error (self::URI_REACHABLE);
    return false;
    }

Leave a Comment