Circum Blog

Circum Net – IT – Conseils pratiques

PHP DOM – Validation d’un document XML

Uncategorized

En PHP, à travers l’API DOM, il est possible de vérifier la validité d’un document XML par rapport à une DTD. On utilise pour cela la méthode ‘validate’ de l’objet ‘DOMDocument’.

<?php
$dom = new DOMDocument;
$dom->Load('biblio.xml');
if ($dom->validate())
    {
    echo "Ce document est valide !\n";
    }
?>

On peut intégrer, suite à la validation, la gestion des éventuels messages d’erreur comme illustré dans le code qui suit :

<?php
$dom = new DOMDocument;
$dom->load('biblio.xml');
libxml_use_internal_errors(true);
if ($dom->validate())
    {
    echo 'Ce document est valide !';
    }
else
    {
    echo 'Document non valide:';
    $errors = libxml_get_errors();
    foreach ($errors as $error)
    {
    echo 'message: ('.$error->code.') '.$error->message.'';
    echo 'ligne: ' . $error->line . '';
    }
}
?>

Il est également possible de pousser plus avant la phase de validation en ayant recours non plus aux DTD mais aux schémas XML. Ceux-ci, définis par le W3C comme une alternative aux DTD, sont écrits en XML et permettent de préciser un ensemble de définitions et de contraintes appliquables aussi bien sur le contenu que sur la structure même d’un document XML.

On utilise pour ce type de validation la méthode ‘schemaValidate’ de l’objet ‘DOMDocument’.

<?php
$dom = new DOMDocument;
$dom->Load('biblio.xml');
if ($dom->schemaValidate('biblio.xsd'))
    {
    echo "Ce document est valide !\n";
    }
?>


Comment constituer une expression régulière ?

Uncategorized

Les expressions régulières permettent de définir des modèles à comparer à une chaîne de caractères. En pratique, elles facilitent grandement la manipulation de textes et de données: recherche, comparaison, substitution, tri de caractères.Elles sont utilisées par de nombreux programmes et leur exploitation constitue pour certains langages de programmation un atout.

Le “modèle” d’une expression régulière pourra être comparé à un ensemble de chaînes de caractères. Ce modèle détermine les critères d’appartenance d’une chaîne à un ensemble (les mots commençant par la lettre ‘s’, les mots contenant la suite de caractères ‘http’ ou se terminant par ‘.com’ …).

Exemples :

[0-9]
correspond à un chiffre de 0 à 9

[^0-9]
correspond à tout sauf à un chiffre de 0 à 9

^[0-9]+$
correspond aux nombres entiers

[a-zA-Z0-9_]
correspond à un caractère mot

[ \t\n\r]
correspond à un caractère d’espace (espace simple, tabulation, nouvelle ligne, retour à la ligne)

^[^@ ]+@[^@ ]+\.[^@ \.]+$
correspond à une adresse de courrier électronique

^[a-zA-Z0-9]+://[^ ]+$
correspond à une adresse url

Une expression régulière, comme on peut le constater dans les exemples ci-dessus, se limite à une suite de caractères. Cette suite est composée de deux types de caractères: les caractères dits “spéciaux” et les caractères dits “normaux”. Les caractères spéciaux (ou caractères “réservés”) ont une signification particulière pour le moteur/programme qui interprètera l’expression régulière. Les caractères normaux (ou standards) représentent, eux, les caractères alphanumériques habituels (abc …, 123 …).

L’exemple le plus basic d’expression régulière est certainement un suite de caractères standards (l’expression “ville” représente simplement le mot “ville”). Mais, en utilisant des caractères spéciaux on peut rendre cet exemple plus sophistiqué (l’expression “villes?” représente les mots “ville” et “villes”).

Analysons à présent la signification de quelques caractères spéciaux :

Le caractère “^” indique le début d’une chaîne de caractères
^u : représente les chaînes qui commencent par la lettre “u”

Le caractère “$” indique la fin d’une chaîne de caractères
s$ : représente les chaînes qui se terminent par la lettre “s”

Les caractères “+”, “*” et “?” expriment le nombre d’occurences d’un caractère ou d’une séquence
a+ : représente les chaînes contenant au moins une fois la lettre “a”
e*: représente 0,1, ou plusieurs occurences de la lettre “e”
s? : représente 0 ou 1 occurence de la lettre “s”

Le caractère “.” représente n’importe quel caractère unique
a.+ : représente les chaînes contenant la lettre “a” suivie d’au moins un caractère

La barre verticale “|” traduit une alternative
du|des : représente les chaînes “du” ou “des”

Les crochets [ ] précisent une liste de caractères à envisager
[abc] : représente les lettres “a”, “b” ou “c”
[^abc] : représente n’importe quel caractère sauf les lettres “a”, “b” et “c”
^[abc] : représente les mots qui commencent par la lettre “a”, “b” ou “c”
^[a-z] : représente les mots qui commencent par une lettre minuscule