preg_remplace dans un preg_replace ? ^^

Eléphanteau du PHP | 11 Messages

04 sept. 2007, 12:04

Bonjour, je suis en train de créé une fonction me permettant de gérer des bbcodes.

Dans cette fonction j'arrive à la balise code qui d'apres mon code devrait figurer comme ça sur ma page au final :

Code : Tout sélectionner

<ol class="code"> <li>Lorem ipsum dolor sit amet</li> <li>consectetuer adipiscing elit</li> <li>Aliquam lacinia blandit arcu</li> <li>Nullam mollis, libero vitae scelerisque posuere, eros risus pellentesque nisi</li> <li>sed gravida mi nisi id dolor. Mauris nec massa at mi venenatis iaculis</li> </ol>
Et sur ma page php dans la fonction appelée :

Code : Tout sélectionner

[code]Lorem ipsum dolor sit amet consectetuer adipiscing elit Aliquam lacinia blandit arcu Nullam mollis, libero vitae scelerisque posuere, eros risus pellentesque nisi sed gravida mi nisi id dolor. Mauris nec massa at mi venenatis iaculis
[/code]

J'arrive tres bien à remplacer les balise Code, mon probleme est que à chauque saut de ligne à l'interieur de ses balise il faut qu'il soit remplacé par un élément de liste <li></li>.

J'ai donc essayé :

Code : Tout sélectionner

$remplace = preg_replace('#\[code](.+?)\
#si','</p><ol class="code"><li>' . preg_replace('/\n/', '</li><li>', '$1') . '</li></ol><p>',$remplace);[/code]

Mais seul la premiere fonction preg_replace fonctionne, la deuxieme est comme ignorée est affiche le code suivant :

Code : Tout sélectionner

<ol class="code"> <li>Lorem ipsum dolor sit amet consectetuer adipiscing elit Aliquam lacinia blandit arcu Nullam mollis, libero vitae scelerisque posuere, eros risus pellentesque nisi sed gravida mi nisi id dolor. Mauris nec massa at mi venenatis iaculis</li> </ol>
Comment faire pour appliqué une fonction sur ce fameux $1 ou \\1 ?


PS : Je savais pas si Debuter en php ou PHP 4 convenait le mieux ^^ comme je me considère comme debutant je met ici.
Modifié en dernier par nairolf287 le 04 sept. 2007, 14:14, modifié 1 fois.
nairolf287 ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 sept. 2007, 12:56

J'ai un doute et rien pour vérifier la tout de suite mais si ton expression de remplacement est quelque chose du genre "xxx" . fonction("$1") . "xxx", je ne sais plus si ca fonctionne ou pas.

Sinon tu peux utiliser l'option "e" des expressions régulières, ce qui aura pour effet d'évaluer le code et il te suffira donc d'écrire la chaine a évaluer avec l'appel à la fonction :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 11 Messages

04 sept. 2007, 13:24

Merci, je n'avais meme pas penser à faire fonction("$1"); ^^

Je vais tester ça et vous dis si ca marche :wink:

Edit : En théorie ca devrait fonctionné seulement $1 n'a pas l'ai d'etre considéré comme une variable et si je fait une fonction par exemple :
function remplace_code($code) {
	echo $code;
return true ;
}
Que j'aplique sur $1 ( remplace_code("$1") ) il me renvoie tout simplement $1 en texte et pas son contenu ^^.

J'ai essayé de lever les " " mais là ça bug car $1 est invalide à cause du numéro.
Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in ...
Peut etre que la solution est de remplacer la variable $1 en vrai variable mais la encore je ne sais pas :roll:

PS : Pour l'option "e" je n'ai aps tres bien compris comment elle marchait ^^ mais j'ai vu qu'elle était déconseillée :?
nairolf287 ...

ViPHP
ViPHP | 1380 Messages

04 sept. 2007, 16:14

En plus des raisons de sécurité que tu évoques, j'ai toujours détesté preg_replace() option e pour la difficulté d'utiliser les références arrières et l'utilisation "spéciale" des guillemets.

Dans ton cas, essaye:
preg_replace('#ton_motif#Use', 'remplace_code("$1")', $texte);

// ou

preg_replace('#ton_motif#Use', "remplace_code('$1')", $texte);
Je te recommande chaudement de plutôt te tourner vers la fonction preg_replace_callback(), bien plus facile à gérér et souvent beaucoup plus rapide.

Voir tuto PHPFrance
ripat

Eléphanteau du PHP | 11 Messages

04 sept. 2007, 16:22

En plus des raisons de sécurité que tu évoques, j'ai toujours détesté preg_replace() option e pour la difficulté d'utiliser les références arrières et l'utilisation "spéciale" des guillemets.

Dans ton cas, essaye:
preg_replace('#ton_motif#Use', 'remplace_code("$1")', $texte);

// ou

preg_replace('#ton_motif#Use', "remplace_code('$1')", $texte);
C'est pas tres juste d'appeler la fonction entre " " ou ' ' nan ?
Je vais me renseigner peut etre pour preg_replace_callback
nairolf287 ...

ViPHP
ViPHP | 1380 Messages

04 sept. 2007, 16:32

C'est pas tres juste d'appeler la fonction entre " " ou ' ' nan ?
Je ne sais pas ce que tu appelles "juste" mais en tout cas, les deux lignes de code que je t'ai données plus haut sont conformes et correctes - à défaut d'être lisibles!
ripat

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 sept. 2007, 16:34

C'est pas un appel, c'est une chaine de caractère que php va évaluer comme une instruction puisque l'option "e" est spécifiée :)
En gros il évalue la chaine 'remplace_code("$1")' et exécute l'instruction remplace_code("$1")
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 11 Messages

04 sept. 2007, 16:36

C'est pas un appel, c'est une chaine de caractère que php va évaluer comme une instruction puisque l'option "e" est spécifiée :)
En gros il évalue la chaine 'remplace_code("$1")' et exécute l'instruction remplace_code("$1")
Ah d'accord ! Je n'avais pas compris.

Encore une question du debutant, l'option e est specifiée à quelle endroit ? :D

Edit sur #Use je crois nan ? :?

voila j'ai fait avec l'option e ça à l'air de marcher tres bien, merci beaucoup :D
Modifié en dernier par nairolf287 le 04 sept. 2007, 16:41, modifié 1 fois.
nairolf287 ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 sept. 2007, 16:41

Toutafé :)

mais regarde quand même du coté de la fonction callback proposée par Ripat, sans doute plus simple à utiliser que l'option eval
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 11 Messages

04 sept. 2007, 16:43

Toutafé :)

mais regarde quand même du coté de la fonction callback proposée par Ripat, sans doute plus simple à utiliser que l'option eval
Oui je vais y jeter un coup d'oeil encore merci pour toutes ces infos :wink:
nairolf287 ...