- Ymox,
Bonjour à tous !
Je viens vers vous pour tenter de comprendre quelque chose qui vous paraîtra peut-être logique, mais qui m’échappe.
Avec l’idée de "normaliser" des noms de classes sous forme snake_lower_case
, j’utilise preg_replace('`(?<=[a-z])([A-Z]+)`', '-$1', $objectName)
couplé à strtolower()
, ce qui fonctionne très bien quand $objectName
ne comprend pas d’espace de nom.
Mais justement, je vais devoir faire le même genre de traitement, mais sur des noms d’objets complets. Du coup, appeland déjà preg_replace()
qui permet d’effectuer plusieurs remplacements, je me suis dit que je pouvais bien utiliser une autre regex. Mais apparemment, ça ne fonctionne pas comme ça.
Ma nouvelle regex était simplement '`(?<=\\\\)[A-Za-z]+$`'
, et je m’attendais à pouvoir récupérer le nom de ma classe avec $0
, vu que l’assertion était pour moi non-capturante. Surprise, je récupère l’entier de ma chaîne initiale. Je tente alors avec $1
et là, c’est la partie "complémentaire" de celle que je souhaite que je me vois retourner. Pareil, avec $2
et quelques suivants que je teste pour être sûr.
Je remarque alors que dans ma première regex, j’avais des parenthèses pour le groupe après l’assertion. OK, je teste donc avec '`(?<=\\\\)([A-Za-z]+)$`'
. Seulement au lieu d’avoir l’espace de nom dès $1
, je l’ai à partir de $2
, $0
et $1
me retournant ma chaîne initiale.
Perdu, je tente de voir ce que me retourne preg_match()
: avec la première expression, j’ai bien le nom de ma classe, et avec la seconde, je l’ai même deux fois…
Histoire d’en être sûr, je tente de voir ce que valent quelques autres groupes. Avec la première regex, si j’utilise le masque de remplacement $0, $1, $2, $3, $4
, j’ai comme résultat la chaîne initiale pour $0
, et rien pour les autres. Avec la seconde, surprise ! J’ai aussi ma chaîne complète pour $0
, mais je récupère aussi juste le nom de la classe pour $1
.
Mais du coup, pourquoi est-ce que l’utilisation de $1
tout seul avec la seconde regex me retournait pourtant ma chaîne initiale ?!
J’ai tenté avec preg_match()
, et là pourtant, avec ma première regex j’ai bien mon nom de classe, et avec la seconde je l’ai deux fois, mais plus trace de la chaîne initiale dans les résultats…
Merci d’avance.