[spip-dev] Re: [Spip] Problème d'interprétation de balise à l'intérieur d'une boucle

Oups, je me trompe : $adresse = '[(#PS|chainephp)]';
Justement chainephp sert à échapper les ' et pas les "...

inc-calcul-squel n'a rien à voir avec ça, il ne peut pas savoir si le champ
en question sera passé au sein d'un bout de code php (donc à échapper) ou
normalement (donc à passer tel quel).

@ Antoine Pitrou <antoine@rezo.net> :

Fil wrote:
>... et la sécurité
>
>$adresse = "[(#PS|chainephp)]"; // dans la version de developpement

Je comprends pas à quoi sert cette fonction....

Dans inc-calcul-squel, on utilise :
ereg_replace("([\\\\'])", "\\\\1", $objet->texte)

qui avait l'air de marcher très bien ??

_______________________________________________
spip-dev@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-dev

-- Fil

Fil wrote:

inc-calcul-squel n'a rien à voir avec ça, il ne peut pas savoir si le champ
en question sera passé au sein d'un bout de code php (donc à échapper) ou
normalement (donc à passer tel quel).

Non c'est la même fonction, il inclut la chaîne dans un code PHP.
Et la ereg marche au poil (enfin y a des chances, vu les bizarreries
Jajascript qui ne plantent pas avec).
Le double str_replace, à vue de nez, il risque de provoquer
des effets de bord.

Soit un squelette :

<BOUCLE_article(ARTICLES){id_article}>
#TITRE<br>
<?php
    echo '#TITRE';
?>
</BOUCLE_article>

Soit un article dont le titre est « L'"orage" menace ». (les guillemets inclus)

Tu prétends que inc-calcul-squel échappe le ' dans le second #TITRE et pas
dans le premier ? Et que les " sont préservés correctement ?

@ Antoine Pitrou <antoine@rezo.net> :

Fil wrote:
>
>inc-calcul-squel n'a rien à voir avec ça, il ne peut pas savoir si le champ
>en question sera passé au sein d'un bout de code php (donc à échapper) ou
>normalement (donc à passer tel quel).

Non c'est la même fonction, il inclut la chaîne dans un code PHP.
Et la ereg marche au poil (enfin y a des chances, vu les bizarreries
Jajascript qui ne plantent pas avec).
Le double str_replace, à vue de nez, il risque de provoquer
des effets de bord.

>>ereg_replace("([\\\\'])", "\\\\1", $objet->texte)

_______________________________________________
spip-dev@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-dev

-- Fil

Fil wrote:

Soit un squelette :

<BOUCLE_article(ARTICLES){id_article}>
#TITRE<br>
<?php
    echo '#TITRE';
?>
</BOUCLE_article>

Soit un article dont le titre est « L'"orage" menace ». (les guillemets inclus)

Tu prétends que inc-calcul-squel échappe le ' dans le second #TITRE et pas
dans le premier ? Et que les " sont préservés correctement ?

Non, je voulais dire que la façon correcte de faire "phpchaine", c'est de
récupérer la ereg de inc-calcul-squel. Et de répercuter le changement dans
inc-calcul-squel après.

Non, je voulais dire que la façon correcte de faire "phpchaine", c'est de
récupérer la ereg de inc-calcul-squel. Et de répercuter le changement dans
inc-calcul-squel après.

>>>>ereg_replace("([\\\\'])", "\\\\1", $objet->texte)

Ah! J'ai compris... quels sont les critères qui te poussent à préférer

    $texte = ereg_replace("([\\\\'])", "\\\\1", $texte);

à la combinaison (fonctionnellement équivalente, je crois) :

    $texte = str_replace ('\\', '\\\\', $texte);
    $texte = str_replace ('\'', '\\\'', $texte);

?

-- Fil

Fil wrote:

Ah! J'ai compris... quels sont les critères qui te poussent à préférer

    $texte = ereg_replace("([\\\\'])", "\\\\1", $texte);

à la combinaison (fonctionnellement équivalente, je crois) :

    $texte = str_replace ('\\', '\\\\', $texte);
    $texte = str_replace ('\'', '\\\'', $texte);

Heu.... rien en fait, c'est le \' qui m'avait induit en erreur....

(c'est compréhensible, ces machins :slight_smile:

On peut rendre le code plus lisible comme ça, avec des commentaires.

  function chainephp($texte) {
    /* apostrophe = chr(39) *
     * backslash = chr(92) */

    $texte = str_replace (chr(92), chr(92).chr(92), $texte);
    $texte = str_replace (chr(39), chr(92).chr(39), $texte);
    return ($texte);
  }

@ Antoine Pitrou <antoine@rezo.net> :

Fil wrote:
>Ah! J'ai compris... quels sont les critères qui te poussent à préférer
>
> $texte = ereg_replace("([\\\\'])", "\\\\1", $texte);
>
>à la combinaison (fonctionnellement équivalente, je crois) :
>
> $texte = str_replace ('\\', '\\\\', $texte);
> $texte = str_replace ('\'', '\\\'', $texte);

Heu.... rien en fait, c'est le \' qui m'avait induit en erreur....

(c'est compréhensible, ces machins :slight_smile:

_______________________________________________
spip-dev@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-dev

-- Fil

Fil wrote:

On peut rendre le code plus lisible comme ça, avec des commentaires.

  function chainephp($texte) {
    /* apostrophe = chr(39) * * backslash = chr(92) */

    $texte = str_replace (chr(92), chr(92).chr(92), $texte);
    $texte = str_replace (chr(39), chr(92).chr(39), $texte);
    return ($texte);
  }

Heu, non, c'est ok comme c'est :))