Aller au contenu

Problème de Regex


Occi

Sujets conseillés

Bonjour,

apres une nuit de gallère sur un bout de code je vais finir par manger mon clavier :mad2:

Si un connaisseur d'expressions régulières pouvait m'aider svp.

Je cherche à remplacer un [bbcode] par un code html du type <div id="bbcode_1">blabla</div>, jusque là pas de souci.

Le problème est que si il y a un 2eme BBcode sur la même page il faut que j'incrémente obligatoirement de cette façon <div id="bbcode_2">blabla 2 eme texte</div>, là c'est la misère totale dans le Regex j'y connais rien.

Voici mon code :

function bbcode($text){

$text = preg_replace_callback('#\[bbcode\](.*?)\[/bbcode\]#s', 'bbcode_id', $text);
return $text;
}
function bbcode_id($matches){
$num_bbcode = count($matches);
$str = '';
$i = 1;
while($i<=$num_bbcode){
$str .= '<div id="bbcode_'.$i++.'">'.$matches[1].'</div>';
$i++;
}

return $str;
}

Rien à faire au lieu de m'afficher <div avec un bbcode_1 .... <div avec un bbcode_2 etc à la place de mon bbcode_x à incrémenter il me met la boucle sur chaque BBcode :/

Sinon j'ai trouvé et battaillé sur cet exemple mais je n'ai pas eu meilleur résultat :

$image="image125.jpg"; 

function ajoute($masque)
{
return $masque[1].($masque[2]+1).$masque[3];
}
$image=preg_replace_callback('`(\w*?)(\d+)?(\.jpg)`','ajoute',$image);

echo $image;

En espèrant pouvoir trouver de l'aide sur le Hub ?

Bon Week end à tous

... vais me coucher :wacko:

Modifié par Occi
Lien vers le commentaire
Partager sur d’autres sites

preg_replace_callback exécute le code php à chacune des occurences, et non toutes les occurences d'un bloc comme ton code semble être construit.

il n'est pas utile de t'intéresser à autre chose que [bbcode] et [/bbcode] qui peut s'écrire #\[/?bbcode\]# s'en plus.

pour l'incrémentation en procédural, tu peux utiliser une variable statique dans la fonction bbcode_id, une variable statique est similaire à une variable globale sauf que sa portée est limitée à la fonction et sa définition exécutée qu'une seule fois. sinon preg_replace_callback va bien dans une classe :)

<style type="text/css">
div {display:inline;}
#bbcode_1 {color:red;}
#bbcode_2 {color:blue;}
#bbcode_3 {color:green;}
#bbcode_4 {color:magenta;}
#bbcode_5 {color:cyan;}
</style>

<?php

function bbcode($text){
return preg_replace_callback('#\[/?bbcode\]#', 'bbcode_id', $text);
}

function bbcode_id($matches){
static $i=0;
if(substr($matches[0],1,1)=='/') { // est-ce [/bbcode] ?
// alors retourner </div>
return '</div>';
}
// donc c'est [bbcode]
// alors incrémenter $i et retourner <div id="...">
return '<div id="bbcode_'.(++$i).'">';
}

$contenu='[bbcode]salut
[bbcode]et[bbcode]
bonjour.[/bbcode][/bbcode]
[bbcode]ceci est-il valable?[/bbcode][/bbcode]
[bbcode] j\'espère bien :[[/bbcode]';

echo htmlentities($resultat=bbcode($contenu)),'<hr>',$resultat;

?>

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...