Le trait d'union dans les ensembles des expressions régulières PHP
Le trait d'union - est aussi un métacaractère à l'intérieur de []
(mais pas à l'extérieur). Si vous avez besoin du trait d'union lui-même
comme caractère - placez-le à un endroit
où il ne sera pas interprété comme un séparateur
d'intervalle.
Pourquoi c'est important : vous pouvez créer un intervalle
de caractères sans vous en rendre compte. Par exemple,
comme ceci - [:-@] - vous pensez que vous
sélectionnez le deux-points, le trait d'union et l'arobase, mais
en réalité, vous obtenez l'intervalle de caractères entre
: et @. Cet intervalle inclut
les caractères suivants : :, ;, ?,
<, =, >.
D'où viennent-ils ? De la table ASCII - le deux-points a un numéro inférieur à celui de l'arobase - et cela forme un intervalle. C'est-à-dire que tous les intervalles sont basés sur la table ASCII (on peut utiliser cela si on le souhaite).
Comment y remédier : placez le trait d'union
à un endroit où il ne sera certainement pas interprété comme
un métacaractère d'intervalle, par exemple, au début ou à la fin
(c'est-à-dire après [ ou avant ]).
On peut aussi échapper le trait d'union - alors
il représentera lui-même, indépendamment de sa
position. Par exemple, au lieu de [:-@], écrire
[:\-@] - et il n'y aura plus d'intervalle, mais
trois caractères - le deux-points, le trait d'union et l'arobase @.
Exemple
Dans l'exemple suivant, le motif de recherche est :
le chiffre 1, puis une lettre de 'a'
à 'z', puis le chiffre 2 :
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
En conséquence, la variable contiendra ce qui suit :
'! 1-2 ! !'
Exemple
Échappons maintenant le trait d'union. En conséquence,
le motif de recherche est : le chiffre 1, puis
la lettre 'a', ou le trait d'union, ou la lettre 'z',
puis le chiffre 2 :
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
En conséquence, la variable contiendra ce qui suit :
'! ! 1c2 !'
Exemple
On peut simplement déplacer le trait d'union, sans l'échapper :
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
En conséquence, la variable contiendra ce qui suit :
'! ! 1c2 !'
Exemple
Dans l'exemple suivant, le motif de recherche est :
le premier caractère - est une lettre minuscule ou
un trait d'union '-', puis deux lettres 'x' :
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
En conséquence, la variable contiendra ce qui suit :
'! Axx ! @xx'
Exemple
Dans l'exemple suivant, le motif de recherche est :
le premier caractère - est une lettre minuscule, majuscule
ou un trait d'union '-', puis deux lettres
'x' :
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
En conséquence, la variable contiendra ce qui suit :
'! ! ! @xx'
Exemple
On peut placer le trait d'union entre deux intervalles - là, il ne créera certainement pas un autre intervalle :
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
En conséquence, la variable contiendra ce qui suit :
'! ! ! @xx'
Tâches pratiques
Soit la chaîne :
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Trouvez toutes les chaînes correspondant au motif suivant :
la lettre 'x', une lettre majuscule ou minuscule
ou un trait d'union, la lettre 'z'.
Soit la chaîne :
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Trouvez toutes les chaînes correspondant au motif suivant :
la lettre 'x', puis soit le signe dollar, soit
le trait d'union, soit le signe plus, puis la lettre 'z'.