Précision syntaxique expression régulière

Nouveau WRInaute
Bonjour à tous,

:oops: ma question m'ennuie plus par honte qu'autre chose: c'est bien une question syntaxique que j'ai à poser ! Et j'ai osé ne pas trouver cela ni sur les différents sites abordant le sujet, ni dans la doc officielle sur les .htaccess (mod_rewrite et autres docs d'Apache)

J'ai vu, à plusieurs reprises, dans des expressions régulières, apparaître un
[^.]

et cela m'a drôlement surpris: je ne suis certes pas un vieux routier de .htaccess mais là.... en m'en tenant aux définitions énoncées partout: le ^ indique une exclusion et le . tous les caractères. Donc ce crochet signifierait --pour moi j'entends :? :? -- "une absence de tout caractère"... Or là je ne vois pas l'intérêt d'indiquer ça au milieu d'une règle.

D'ailleurs lorsqu'il est suivi par [^.]+
là je comprends évidemment encore moins...

Bref je me suis dit que parmis vous qqn saura me dire ce que veut dire "en vrai" cette syntaxe. :D

la première fois que j'ai vu ça c'était sur les pages d'Apache, le guide du rewriting:

we can use the following ruleset to rewrite
http://www.username.host.tld/anypath
internally to:
/home/username/anypath
et pour faire cela ils proposent le .htaccess suivant :
Code:
RewriteEngine on
RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2

donc la syntaxe qui m'a échappé dans mes lectures, c'est uniquement ce [^.]
(le reste ça va plutôt bien je crois... du moins celui là je le comprendais mieux bientôt j'espère...) Salut !

Merci par avance à vous.
 
WRInaute discret
Bonjour Davidc,

J'ai quelques lignes d'expressions régulières à mon actif (page d'accueil, fil rss dynamiques sur mon site) et j'arrive à la même conclusion que toi : théoriquement, [^.] désignerait une chaîne qui ne contient pas "tout caractère". En d'autres termes, une chaîne vide.

Deux arguments vont pourtant à l'encontre de cette conclusion :
- la règle proposée fait exactement l'inverse : elle récupère dans la variable $2 la chaîne constituée de n'importe quel caractère située entre "www." et ".host.com" de l'url ("username" dans l'exemple) ;
- la présence du "+" qui signifie "un ou plusieurs fois" n'a absolument aucun sens derrière une chaîne vide.

Personellement, j'aurais écrit :
(.+) au lieu de ([^.]+).

Alors y a-t-il un fonctionnement particulier des exp. reg. dans l'url rewriting ?
Ou bien n'ai-ja pas encore tout compris des exp. reg. ? J'ai maintenant un doute :cry: . Merci Davidc :wink: . Y aura-t-il une bonne âme pour me l'ôter ?
 
WRInaute occasionnel
[] représente un groupement de caractères, le . à l'intérieur d'un groupement n'a plus de sens particulier. Voir Bracket Expression pour la version longue, le bout correspondant :
. * [ \
(period, asterisk, left-bracket and backslash, respectively) lose their special meaning within a bracket expression.
Donc [^.]+ signifie n'importe quoi sauf un point.
 
Nouveau WRInaute
Ah... merci !!!

Merci bien ! :lol:

MAis je trouve que -quand même- ils pourraient le dire plus excplicitement sur leur page (Apache)... Enfin je vais las relire plus en détail.
PArce qu'ils disent eux même (et c'est le cas) qu'ils ont modifié et adpaté deux ou trois trucs par rapport à l'lhabitude, mais sans dire en détail toute les syntaxes possibles.

Les autres sites en parlant mériteraient de l'ajouter dans leurs articles.
Enfin voilà, le précédent est créé et cette info est désormais dans les tables, clairement....


Merci à nouveau ! :!:
 
WRInaute occasionnel
Juste pour être complet, ce n'est pas une modification introduite par Apache, ca fait partie des spécifications des expressions régulières.
 
WRInaute discret
nikoshr a dit:
Donc [^.]+ signifie n'importe quoi sauf un point.
Je suis surpris, pour moi un point dans une expression régulière doit être "échappé", soit [^\.].
Est-ce que c'est la présence du métacaractère "^" qui permet de se dispenser de l'antislash ?
 
WRInaute passionné
Phil Entropie a dit:
Je suis surpris, pour moi un point dans une expression régulière doit être "échappé", soit [^\.].
Est-ce que c'est la présence du métacaractère "^" qui permet de se dispenser de l'antislash ?

Regarde le message de nikoshr : "(period, asterisk, left-bracket and backslash, respectively) lose their special meaning within a bracket expression."

---> "Le point, l'astérisque, le crochet ouvrant et le backslash perdent leur signification spéciale quand ils sont entre crochets"

Fred
 
WRInaute passionné
Bonjour,

pour développer la réponse de nikoshr, la paire de crochets définit une classe de caractères, c'est à dire un jeu de caractères auquel le caractère recherché doit appartenir. L'expression entre crochets ne correspond qu'à un caractère seulement.

Ainsi tout caractère spécial (. \ * + ...) perd sa signification entre crochets pusqu'il peut être lui-même l'objet de la recherche. Dans l'exemple [^.] on recherche n'importe quel caractère sauf le point.
Exceptions : caractères spéciaux utilisés entre crochets : \ échappement, ^ exclusion d'un caractère ou d'une plage, - spécifie une plage de caractères.
 
Nouveau WRInaute
:arrow: et pour continuer à préciser, puisque j'ai lu l'article initialement proposé, quand on lit
Exceptions : caractères spéciaux utilisés entre crochets : \ échappement, ^ exclusion d'un caractère ou d'une plage, - spécifie une plage de caractères.

il faut comprendre qu'ils peuvent avoir une signification mais seulement à un endroit précis.
PAr exemple [^a] exclu la lettre a
tandis que [a^] impose la lettre a OU le caractère ^ (qui n'a ce sens d'exclusion que s'il est en première place). Ainsi on peut le citer, même lui, dans la liste des caractères possibles.

Sinon je reviens sur une remarque faite un peu plus haut, je n'ai pas prétendu qu'Apache faisait sur ce point là une exception, mais j'ai dit que puisqu'il y en avait (parfois) il aurait été agréable d'avoir une documentation plus complète sur les syntaxes connues et employées par eux. Mais passons... :wink:

Sinon, après de toute façon, un peu de pratique et quelques essais aident à devenir déterministe.
:roll:

D'ailleurs, pour poursuivre sur ce sujet: y a-t-il déjà une bonne doc en franaçis complète sur ces syntaxes egrep d'Apache (j'ai dit complète, sinon c'est trop facile à trouver) ? Ou est-ce à faire ? :? ... PArce que finalement c'est ça qui manque.
 
WRInaute passionné
Davidc a dit:
:arrow: et pour continuer à préciser, puisque j'ai lu l'article initialement proposé, quand on lit
Exceptions : caractères spéciaux utilisés entre crochets : \ échappement, ^ exclusion d'un caractère ou d'une plage, - spécifie une plage de caractères.

il faut comprendre qu'ils peuvent avoir une signification mais seulement à un endroit précis.
PAr exemple [^a] exclu la lettre a
tandis que [a^] impose la lettre a OU le caractère ^ (qui n'a ce sens d'exclusion que s'il est en première place). Ainsi on peut le citer, même lui, dans la liste des caractères possibles.
Excellente remarque. Effectivement ^ reste un caractère spécial entre crochets s'il est juste après le crochet ouvrant.
Pour \ : s'il est juste avant un caractère spécial.
Et - : s'il est entre 2 car. non spéciaux pour définir une classe de car. ( [a-zA-Z] par exemple )
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut