Page 1 sur 2
souligné
Posté : 03 sept. 2022, 13:20
par Sylvain255
Bonjour je voudrais remplacer les textes ^^texte^^ par <span style="text-decoration:underline">texte</span> dans un texte, je sais qu'on peut le faire avec preg_replace mais je connais pas trop, merci de m'aider, je code en PHP 8
Re: souligné
Posté : 03 sept. 2022, 13:43
par Saian
Salut, tu peux t'en servir en faisant quelque chose dans le genre :
Code : Tout sélectionner
$content = 'un texte souligné ^^ici^^ et ^^la aussi^^';
echo preg_replace('/\^\^(.*?)\^\^/', '<span style="text-decoration: underline;">$1</span>', $content);
Le choix du ^ pour délimiter n'est pas le meilleur étant donné que le ^ est un caractère spéciale dans les regex.
Les / autour du regex c'est parce qu'il faut délimiter le regex avec le caractère de ton choix.
Les \ devant les ^ c'est pour échapper ce caractère spéciale.
Les parenthèses autour du .*? c'est pour capturer cette partie du regex qui est utilisé avec $1 dans l'expression de remplacement.
Le . c'est n'importe quel caractère le * c'est 0 à n caractères et le ? c'est pour que la capture s'arrête à la première paire ^^ au lieu de tout englober jusqu'à la dernière.
Re: souligné
Posté : 03 sept. 2022, 13:49
par Sylvain255
ok merci dernier remplacement à faire : <p>truc</p> en truc<br />, seuls les <p> sans attributs doivent être remplacés donc pas de str_replace (à cause du </p>)
merci beaucoup
Re: souligné
Posté : 03 sept. 2022, 13:53
par Saian
Quelque chose dans le genre, à adapter aux cas particuliers que tu pourrais rencontrer.
A noter le \ devant le / car le slash est utilisé ici comme délimiteur du regex.
Re: souligné
Posté : 03 sept. 2022, 13:59
par Sylvain255
ah je me suis trompé en fait je veux remplacer <p>*truc</p> en *truc\n (l'étoile est le vrai caractère étoile et \n est le retour à la ligne
à noter que je veux la mm chose avec - et _ en remplacement de l'*
en fait c'est que je cherche pour un client à cumuler le tinymce avec php-markdown
merci d'avance
Re: souligné
Posté : 03 sept. 2022, 14:01
par Sylvain255
même le | en remplacement de l'* désolé je sais ça fait bcps
Re: souligné
Posté : 03 sept. 2022, 14:02
par Saian
Code : Tout sélectionner
$pattern = '/<p>(\*|\||-|_)(.*)<\/p>/';
$replacement = "$2\n";
L'utilisation des " en place des ' n'est pas innocente, elle permet au \n d'être interprété comme un retour chariot.
Re: souligné
Posté : 03 sept. 2022, 14:05
par Sylvain255
j'ai fait :
$contenu=preg_replace('/<p>(\*|\||-|_)(.*)<\/p>/', "$2\n", $contenu);
mais ça ne remplace rien !
Re: souligné
Posté : 03 sept. 2022, 14:06
par Saian
Essaie comme ça
avec la version précédente $2 est surement interprété comme une variable inexistante.
Re: souligné
Posté : 03 sept. 2022, 14:08
par Sylvain255
toujours pareil, ça ne fonctionne pas ! ah pas faciles ces expressions régulières !
Re: souligné
Posté : 03 sept. 2022, 14:09
par Sylvain255
je vois que dans la deuxième expression tu as mis (.*) alors que dans la première tu avais mis (.*?) ça ne peut pas venir de là ?
Re: souligné
Posté : 03 sept. 2022, 14:13
par Saian
Alors la ça pourrait venir du fait que les <p></p> ne sont pas sur la même ligne... peut être avec un modificateur PCRE m pour multiligne.
A noter aussi si le caractère *, -, _, | n'est pas juste après le <p> l'expression ne va effectivement pas fonctionner.
Il me faudrait un échantillon réel du contenu à modifier pour voir ce qui ne va pas dans l'expression.
Tu as des sites comme
https://regexr.com/ qui te permettent de tester tes regex.
PS : pour le ? absent, au pire ça sélectionnerait tout du premier <p> au tout dernier </p>.
Re: souligné
Posté : 03 sept. 2022, 14:16
par Sylvain255
non les <p></p> sont sur la même ligne et les * sont juste après le <p>
je t'ai donné mon exemple
apparemment il y a plus de caractères spéciaux en regexp j'ai fait ça :
$contenu=preg_replace('/\<p\>(\*|\||\-|\_)(.*?)\<\/p\>/', '$2'."\n", $contenu);
mais ça ne marche pas non plus
Re: souligné
Posté : 03 sept. 2022, 14:17
par Saian
Re: souligné
Posté : 03 sept. 2022, 14:29
par Sylvain255
j'ai trouvé en fait je faisais ton expression régulière après l'opération sur le domdocument donc j'avais des <p markdown="1"> (donc pas remplacés) et après je lançais markdown donc le markdown=1 disparaissait et je ne m'en rendais pas compte, ça marche merci