[RESOLU] souligné

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 13:20

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

Avatar du membre
Mammouth du PHP | 1609 Messages

03 sept. 2022, 13:43

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.
Modifié en dernier par Saian le 03 sept. 2022, 13:49, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 13:49

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

Avatar du membre
Mammouth du PHP | 1609 Messages

03 sept. 2022, 13:53

Code : Tout sélectionner

$pattern = '/<p>(.*)<\/p>/'; $replacement = '$1<br/>';

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.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 13:59

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

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 14:01

même le | en remplacement de l'* désolé je sais ça fait bcps

Avatar du membre
Mammouth du PHP | 1609 Messages

03 sept. 2022, 14:02

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.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 14:05

j'ai fait :
$contenu=preg_replace('/<p>(\*|\||-|_)(.*)<\/p>/', "$2\n", $contenu);
mais ça ne remplace rien !

Avatar du membre
Mammouth du PHP | 1609 Messages

03 sept. 2022, 14:06

Essaie comme ça

Code : Tout sélectionner

$replacement = '$2'."\n";

avec la version précédente $2 est surement interprété comme une variable inexistante.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 14:08

toujours pareil, ça ne fonctionne pas ! ah pas faciles ces expressions régulières !

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 14:09

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à ?

Avatar du membre
Mammouth du PHP | 1609 Messages

03 sept. 2022, 14:13

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>.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 14:16

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

Avatar du membre
Mammouth du PHP | 1609 Messages

03 sept. 2022, 14:17

https://regexr.com/6t8hh
Peut être ?

Code : Tout sélectionner

$pattern = '/<p>(\*|\||-|_)(.*)<\/p>/gm';
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 26 Messages

03 sept. 2022, 14:29

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