Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Comment éliminer le CR pris en compte avec $

1 view
Skip to first unread message

Otomatic

unread,
Aug 5, 2021, 11:27:23 AM8/5/21
to
Bonjour,

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

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

mais rien à faire directement avec la regexp.

Tout ce que j'ai trouvé comme palliatif c'est d'utiliser
trim($matches[0])

Y-a-t'il une solution ?

Merci.

--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit
nouveau, même si c'est pire qu'avant et cela de toute évidence.
Henry de Montherlant - Va jouer avec cette poussière

Olivier Miakinen

unread,
Aug 5, 2021, 3:17:04 PM8/5/21
to
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

Otomatic

unread,
Aug 6, 2021, 3:36:48 AM8/6/21
to
Olivier Miakinen <om+...@miakinen.net> écrivait :

> 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].
Merci.

Olivier Miakinen

unread,
Aug 6, 2021, 6:49:21 PM8/6/21
to
Bonjour,
Après réflexion, ça doit être possible avec $matches[1] et $matches[0],
sans deuxième paire de parenthèses capturantes. Il suffit de ne pas
aller jusqu'à la fin de la ligne.

Exemples :
/^(Listen 0.0.0.0:)[^\r\n]*/
/^(Listen 0.0.0.0:)[0-9]*/

Voire avec une assertion :
/^(Listen 0.0.0.0:).*(?=\r|\n|$)/

--
Olivier Miakinen

Otomatic

unread,
Aug 7, 2021, 7:18:32 AM8/7/21
to
Olivier Miakinen <om+...@miakinen.net> écrivait :

> Après réflexion, ça doit être possible avec $matches[1] et $matches[0],
> sans deuxième paire de parenthèses capturantes. Il suffit de ne pas
> aller jusqu'à la fin de la ligne.
>
> Exemples :
> /^(Listen 0.0.0.0:)[^\r\n]*/
> /^(Listen 0.0.0.0:)[0-9]*/
>
> Voire avec une assertion :
> /^(Listen 0.0.0.0:).*(?=\r|\n|$)/

- Cas n° 1 : /^(Listen 0.0.0.0:)[^\r\n]*/m
n'a pas de CR à la fin de matches[0]
mais donne des résultats non voulus :
matches[0] =>
[0] => Listen 0.0.0.0:80
[1] => Listen 0.0.0.0:${MYPORT8081}

- Cas n°2 : /^(Listen 0.0.0.0:)[0-9]*/m
n'a pas de CR à la fin de matches[0]
mais donne des résultats non voulus :
matches[0] =>
[0] => Listen 0.0.0.0:80
[1] => Listen 0.0.0.0:
Il faut remplacer * (0 ou plus) par + (un ou plus).

- Cas n°3 : /^(Listen 0.0.0.0:).*(?=\r|\n|$)/m
comporte systématiquement un CR à la fin de matches[0]

La regex que j'ai retenue est :
/^(Listen 0.0.0.0:)[0-9]{2,5}/m
0 new messages