PHP Expressions Régulières ! Modifier plusieurs occurences

WRInaute discret
Bonjour à tous,

Je cherche la solution à un problème que j'ai depuis plusieurs jours.

Je vous explique :

Je cherche à remplacer toutes les occurrences d'une chaine.

Code:
$var = 'tu texte et [intro]Ici du text plus ou moin long[/intro] Ici le reste [intro]Le second texte en rouge[/intro] ...';
    echo preg_replace('`\[intro](.+)\[/intro]`', "<font color=#F00>$1</font>:", $var);

Le problème, c'est que si j'ai une seule occurrence de "intro", ça fonctionne, mais si j'en ai plusieurs, ça ne fonctionne plus.

Pour info : le $1 sera remplacé par str_replace('<br/>','autre chose',$1) je n'ai pas encore testé

Auriez-vous une solution ?

Merci d'avance

Orsam
 
WRInaute impliqué
peut être
echo preg_replace('`\[intro]([^[]+)\[/intro]`', "<font color=#F00>$1</font>:", $var);
ou
echo preg_replace('`\[intro]([^\[]+)\[/intro]`', "<font color=#F00>$1</font>:", $var);
ou
echo preg_replace('`\[intro\]([^[]+)\[\/intro\]`', "<font color=#F00>$1</font>:", $var);
 
WRInaute discret
Bonjour et merci pour cette réponse.

En faite, les trois fonctionnent. Je ne suis décidément pas au point avec les expressions régulières.

Une autre petite question...

Voici un exemple :
Code:
$html = "[intro1]bonjour <br> ceci est le test 1 [/intro1]";
$html .= "[intro2]bonjour <br> ceci est le test 2 [/intro2]";
$html .= "[intro3]bonjour <br> ceci est le test 3 [/intro3]";
$html .= "[intro2]Une autre ligne <strong> ceci est le test</strong> 2 [/intro2]";

Tu m'as montré comment "isoler" chaque "ligne"

Ce que j'essai de faire maintenant, est de transformer UNIQUEMENT les intro2 en entités html avec la fonction htmlentities.

J'ai essayé pas mal de chose comme ça par exemple :

Code:
$html = preg_replace("`\[intro2]([^\[]+)\[/intro2]`", htmlentities("$1"), $html );

Mais rien à faire...

Une idée ?

Merci encore...

Orsam
 
WRInaute discret
[Résolu] PHP Expressions Régulières ! Modifier plusieurs occurences

Bonjour,

J'ai trouvé !!

Code:
$html = preg_replace_callback("`\[intro2]([^\[]+)\[/intro2]`", function ($matches) {
                        return htmlentities($matches[0]);
                    } , $html);

C'est exactement ce que je cherchais !!! 8)

Merci.

Orsam
 
WRInaute impliqué
Si tu as des doutes sur les caractères à échapper dans les expressions régulières, utilise preg_quote.
Exemple en ligne de commande :
Code:
:~$ php -r 'echo preg_quote("[intro2]")."\n";'
\[intro2\]

Ensuite, si tu souhaites protéger les caractères spéciaux HTML, alors utilises plutôt htmlspecialchars.

Ensuite, $matches[0] va prendre tout le contenu correspond à ta RegExp ([intro2]...[/intro2]). Si tu souhaites récupérer le contenu entre les balises (ce qui correspondant aux parenthèses de ta RegExp), alors il faut utiliser l'index 1 : $matches[1]
Mais ça dépend du comportement que tu veux, je ne dis pas que ce que tu as fait est faux.
Mon cas sera utile si tu souhaites remplacer intro2 par de vrai balise HTML.

Pour résumer ce que j'ai écrit :
PHP:
<span class="syntaxdefault"><br /></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />$html </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> preg_replace_callback</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"`\[intro2\]([^[]+)\[/intro2\]`"</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> function </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    return </span><span class="syntaxstring">"<span>"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">htmlspecialchars</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]).</span><span class="syntaxstring">"</span>"</span><span class="syntaxkeyword">;<br />}</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $html</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"></span>

D'ailleurs, sur la doc de PHP, tu as un très bel exemple correspondant à ton cas :
http://php.net/manual/fr/function.preg-replace-callback.php#example-5272
 
Discussions similaires
Haut