Bonjour,
Le 05/08/2021 à 17:27, Otomatic a écrit :
>
> PHP et preg_match
>
> Soit une regexp très simple :
>
> /^(Listen 0.0.0.0:).*$/m
>
> Faites pour récupérer à partir d'un fichier httpd.conf sous Windows
> — donc avec des fins de ligne CRLF — la ligne :
> Listen
0.0.0.0:80 (80 étant le numéro du port)
> - la ligne complète dans $matches[0]
> - la ligne sans le numéro de port dans $matches[1]
>
> Ça fonctionne très bien, sauf sur un point :
> La chaîne $matches[0] contient systématiquement, à la fin, le
> caractère CR (chr(13)) ce qui se voit très bien par :
>> error_log("matches0=".$matches[0]." - fin=".ord(substr($matches[0],-1,1)));
> qui donne :
>> matches0=Listen
0.0.0.0:80 - fin=13
Ok.
> J'ai essayé plein de trucs, dont les parenthèses non capturantes :
> /^(Listen 0.0.0.0:).*(?:\r)$/m
> /^(Listen 0.0.0.0:).*(?:\r$)/m
Le \r a beau ne pas être capturé par des parenthèses, il fait toujours
partie de la ligne, donc il sera dans $matches[0]. Si tu veux l'exclure
il faut une autre paire de parenthèses capturantes, et lire $matches[1]
et $matches[2] plutôt que $matches[0].
Exemples :
/^((Listen 0.0.0.0:)[^\r\n]*)/
/^((Listen 0.0.0.0:)[0-9]*)/
/^(Listen 0.0.0.0:)([0-9]*)/
Attention :
- dans les deux premiers cas, ce que tu avais dans $matches[1] est
maintenant dans $matches[2] et ce que tu voulais dans $matches[0]
est maintenant dans $matches[1] ;
- dans le second cas, $matches[1] est comme avant mais $matches[2]
ne contient que le numéro de port.
Note : j'ai supprimé le $ et l'option m qui me semblent devenus
inutiles (voire néfaste pour le $).
--
Olivier Miakinen