Et c'est un peu moins obscur que les expressions régulières Perl.
Petite explication :
$str =~ s/^\s*//;
$str =~ s/\s*$//;
^ Match the beginning of the line
$ Match the end of the string (or before newline at the end
\d [3] Match a decimal digit character
\s [3] Match a whitespace character
En résumé :
^\s* tous les espaces en début de chaîne
\s*$ tous les espaces en fin de chaîne
s/toto// remplace toto par rien (= supprimer)
s/^\s*// remplace tous les espaces en début de chaîne par rien (= supprimer)
if ($str =~ s/^((?:\d+\.)+\d+)(?::(\d+))?$//) {
n
Prevent the grouping metacharacters () from capturing. This modifier, new in 5.22, will stop $1 , $2 , etc... from being filled in.
"hello" =~ /(hi|hello)/; # $1 is "hello"
"hello" =~ /(hi|hello)/n; # $1 is undef
This is equivalent to putting ?: at the beginning of every capturing group:
"hello" =~ /(?:hi|hello)/; # $1 is undef
http://perldoc.perl.org/perlre.html#Regular-Expressions\d+ suite de chiffres (non vide) = nombre en décimal "1" "23" "111" "000000"
\d+\. nombre en décimal suivi d'un point
((?:\d+\.) idem
((?:\d+\.) au moins une fois : nombre en décimal suivi d'un point "1." "12." "1.3." "12.345." "12.000.56452."
(?:\d+\.)+\d+ série de nombres en décimal séparés par un point "1.0" "12.01" "1.3.5" "12.345.000" "12.3.56452.5111" "12.3.56452.5111.0"
On voit donc qu'à aucun moment on ne vérifie que c'est syntaxiquement une adresse IPv4 bien formée (4 mots de 8 bits écrit en décimal). On va désigner ça par dotted-decimal.
((?:\d+\.)+\d+) idem, rend disponible l'expression matchée plus tard
: deux points
:(\d+) deux points suivi d'un nombre, rend disponible le nombre; appelons ça decimal-port
(?::(\d+)) idem
(?::(\d+))? optionnellement deux points suivi d'un nombre, rend disponible le nombre
^((?:\d+\.)+\d+)(?::(\d+))?$
chaîne complète constituée de dotted-decimal suivi éventuellement de decimal-port, rend disponible les deux composantes sous forme de $1 et $2
exemples :
"1.0" "12.01:124" "1.3.5" "12.345.0:00" "12.3.56452:5111" "12.3.56452.5111.0.12:123422"