La balise permet de fragmenter une chaine en fonction de séparateurs ou de caractères spéciaux.
4 utilisations sont possibles selon le découpage souhaité:
Pour séparer une valeur en fonction de séparateurs connus, il faut utiliser l’attribut « format="séparateur/variable" ». Le découpage peut être effectué partiellement si le séparateur n'est pas trouvé.
Dans ce cas les variables non trouvées restent non définies.
L'attribut « value » vous permet d'indiquer la chaine de caractères que vous souhaitez découper.
<get format="$jour$/$mois$/$annee$" value="31/12/2011">
$annee$ prend alors la valeur 2011, $mois$ 03 et $jour$ 31.<get format="$nom$@$compagnie" value="siteweb@infocosme">
$nom$ prend la valeur siteweb et $companie$ a pour valeur infocosme.
Pour fragmenter une string en un nombre de fragments dépendants de l’apparition des caractères séparateurs utilisez l'attribut « token="liste_des_caractères" ».
Vous pouvez aussi utiliser l’attribut « option="null/notnull" » pour préciser si vous voulez compter ou non les chaines vides (quand deux éléments séparateurs sont l’un à coté de l’autre). La valeur "null" prend en compte les chaines vides et la valeur "notnull’ ne les compte pas. Si option n'est pas précisé, la valeur par défaut est null.
L'attribut « "name" » vous permet de placer les fragments, obtenus par la découpe, dans une variable. Le premier fragment est ainsi obtenu dans la variable : $nom1$, le deuxième dans $nom2$ et ainsi de suite. La variable $nom$ (et $nom.count$) contient le nombre de fragments.
<get value="2011/03/15 12:46" token="/ :">
Génère les variables suivantes :
$date$ => 5 (nombre de valeurs)
$date.count$ => 5 (nombre de valeurs)
$date1$ => 2011 (valeur du premier fragment)
$date2$ =>03 (valeur du second fragment)
…
$date5$ =>46 (valeur du cinquième fragment)
<get tag="val1=12345 val2=56789">
2 variables seront définies : val1 => 12345 val2 => 56789
Exemple avec balise XPROC :
<xproc file="$pathSVG$"><!-- Récupération du paramétrage du SVG -->
<cond expr="$xproc.name$ = svg">
<get tag="$xproc.attributes$">
À partir de la version 4.021a-30, l'attribut regex permet de fournir une expression régulière (du type PCRE2) qui sera utilisée pour parser la valeur passée dans value.
Le champ name permet de nommer les variables résultats (ce sont les pattern entre parenthèses de l'expression régulière), comme dans <get token="...">. Les patterns de recherchent peuvent également être nommés (voir exemple avec date ci-dessous), auquel cas, ces noms de variables seront également affectés.
ATTENTION : dans cette version, un seul match est réalisé, il pas d'équivalent de l'option /g.
La documentation complète de la norme est ici. Le site regex101 permet de tester facilement les expressions régulières (il est par défaut en PCRE2)
Les principaux éléments de recherche dans les expressions régulières PCRE2 sont :
. | any character | |
\d | any decimal digit | |
\D | any character that is not a decimal digit | |
\s | any white space character | |
\S | any character that is not a white space character | |
\w | any "word" character | |
\W | any "non-word" character | |
\b | word boundary | |
\B | not a word boundary | |
\o{ddd..} | character with octal code ddd.. | |
\xhh | character with hex code hh | |
\x{hhh..} | character with hex code hhh. | |
\N{U+hhh..} | character with Unicode hex code point hhh.. (Unicode mode only) |
|
... | D'autres possibilités existent |
À cela s'ajoutent des suffixes précisant le nombre d'occurrences :
* | 0 à n éléments | |
+ | 1 à n éléments | |
? | 0 ou 1 éléments | |
{n} | pour exactement n éléments | |
{n,m} | au moins n, pas plus que m | |
... | Il y a des combinaisons de ces suffixes |
Ainsi que les classes de caractères :
[...] | positive character class | |
[^...] | negative character class | |
[x-y] | range | |
[[:xxx:]] | positive POSIX named set | |
[[:^xxx:]] | negative POSIX named set | |
POSIX named set | ||
alnum | alphanumeric | |
alpha | alphabetic | |
ascii | Code between 0 and 127 | |
blank | space or tab | |
cntrl | control character | |
digit | decimal digit | |
graph | printing, excluding space | |
lower | lower case letter | |
printing, including space | ||
punct | printing, excluding alphanumeric | |
space | white space | |
upper | upper case letter | |
word | same as \w | |
xdigit | hexadecimal digit |
Un résumé complet de ces éléments est disponible ici.
<get name="entier" value="12abc" regex="(\d+)">
Donnera entier.count=1 et entier1=12, le reste de la valeur est ignoré. Pour accepter les entiers négatifs, on peut utiliser (-?\d+).
Contrôler une date au format dd/mm/yyyy :<get name="ipAdr" value="192.168.72.13" regex="(\d+)\.(\d+)\.(\d+)\.(\d+)">
Donnera ipAdr.count=4 et ipAdr1=192, ipAdr2=168, ipAdr3=72, ipAdr4=13
<get name="date" value="31/12/2025" regex="^\s*(?<jour>\d{2})\/(?<mois>\d{2})\/(?<annee>\d{4})\s*$">
Donnera date.count=3 et date1=31, date2=12, date3=2025 Mais aussi jour=31, mois=12, annee=2025
Pour gérer correctement les chaînes UTF-8, il faut préfixer les expressions régulières avec (*UTF) et/ou (*UCP). Voir exemple, dans l'image ci-dessous
Téléchargez rapidement la dernière version du XPX: Version 3.8-rc16 - 05/02/2019
Venez nous poser vos questions et voir les problèmes courants que vous pouvez rencontrer
Aidez-nous à faire vivre ce site en faisant un don