regex en php

php

Le problème exposé dans ce sujet a été résolu.

Bonjour chers amis je bloque sur une regex en php j’ai chercher des solutions sans trouver or selon moi ça doit etre tres simple mais je n’arrive pas merci de m’aider.

voici ma regex

$a = preg_replace("|######(.*)|i", '<h6 id="$1">$1</h6>', $a);

La seule chose que je veux c’est qu’il capture uniquement lorsque la phrase commence par #######. J’ai mis ça :

$a = preg_replace("|^######(.*)|i", '<h6 id="$1">$1</h6>', $a);

Mais sans succès il prend seulement le premier # pas tous les autres pouvez-vous m’aider.

Merci

Bonjour,

La seule chose que je veux c’est qu’il capture uniquement lorsque la phrase commence par #######. J’ai mis ça :

$a = preg_replace("|^######(.*)|i", '<h6 id="$1">$1</h6>', $a);

watanga96

La ligne plutôt que la phrase j’imagine. Déjà ton délimiteur est mal choisi puisque c’est le caractère délimitant les alternatives dans les regex. Ton problème vient du fait que tu ne traites pas ta chaîne en mode multiligne, tu ne délimites pas la fin de la capture.

On dirait que tu essaies de parser du markdown. J’aurais utilisé

$a = preg_replace("`^#{6}\s*(.*)\s*?$`mu", '<h6 id="$1">$1</h6>', $a);

mais tu auras certainement des post-traitements à ajouter sur les éléments capturés, par exemple pour échapper les caractères ou avoir un attribut id valide.

+0 -0

Oui mais ce que je veux dire par-là c’est que ce genre de choix impacte la qualité de ton code. Un bon code ne doit pas porter à confusion, donc on évite les choix douteux pour le lecteur.

Des codes qui fonctionnent et qui sont foireux j’en ai beaucoup vu. Pour éviter de faire perdre du temps aux autres et à toi-même quand tu reviendras dessus il est nécessaire de faire attention dès le départ à cet aspect, donc on privilégie des codes clairs en « ennuyeux ».

^ ne matche que le début de la chaîne.

Il faut le modificateur m pour que ^ matche le début de la chaîne ou le début d’une nouvelle ligne. Sinon il faut l’intégrer au motif (assertion arrière sur \R).

En sachant aussi que sur le motif de départ .* intègre les caractères # donc tu vas traiter ce qui a plus de 6 # comme un h6 mais peut être est-ce voulu.

EDIT : autant pour moi, je suis totalement passé au travers de la réponse de Chinoisfurax

Déjà ton délimiteur est mal choisi puisque c’est le caractère délimitant les alternatives dans les regex.

Ca m’arrive aussi d’utiliser volontairement un métacaractère comme délimiteur quand je génère dynamiquement un motif juste pour m’éviter de préciser le second paramètre de preg_quote. Ca ne change rien car il n’est utilisé que par PHP pour séparer le motif des délimiteurs avant de passer le premier à PCRE(2).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte