Vous n'êtes pas connecté.


Salut,
pour une fois je pose une question 
ça fait une bonne 10aine d'heures que je cherche, mais je ne comprends toujours pas ... Je retape mon site d'anatomie, et dans les cours, il y a des schémas.
Chaque schéma est inscrit dans la base de données avec un identifiant (clé primaire), puis une url, un titre, etc. et dans mon code source (HTML), lui aussi dans une table SQL, j'insère des marqueurs pour les schémas. Le but du jeu est de remplacer ces marqueurs par des vignettes de schémas. (l'intérêt est double : pouvoir afficher une vignette du schéma ou bien prévoir une version imprimable de la page, ceci sans pour autant se soucier du nombre de schémas dans la page, vu que c'est "lu" automatiquement)
Explication concrète :
-----------------------
je mets mes "marqueurs" sous forme d'un pseudo BBCode comme ceci : [schema]45[/schema] où le chiffre (45 ici) est l'identifiant dans la base de données du schéma.
Avant l'affichage de la page, je récupère ce chiffre à l'aide d'une expresstion rationnelle comme suit :
$thispage['content'] = eregi_replace("\[schema\] ?([^\[]*) ?\[/schema\]",Schema('\\1') , $thispage['content']);Ma fonction "Schema" pour le moment ne me retourne que le chiffre :
function Schema($schema)
{
return "=> ".$schema." <=";
}et lors de l'affichage de ma page, ça marche nickel : j'ai bien mon => 45 <=
Seulement si je modifie ma fonction ainsi :
function Schema($schema)
{
return "=> ".($schema+1)." <=";
}j'obtiens : => <= c.à.d. que le chiffre a disparu ... et je ne comprends pas pourquoi.
Si je le caste en entier, que ce soit par un sprintf("%d",$schema); ou par un (int) $schema, j'obtiens => 0 <= et je cherche pourquoi ... Si quelqu'un a une idée ... Merci !
FYI RTFM ASAP => Tux : La Légende <=
NewsletTux
TOP Hors ligne


PHP n'étant pas un langage strictement typé, tu ne devrais pas avoir à convertir le type.
Cependant, essai intval($schema).
Sinon, faudra chercher du côté de l'ordre des opération de eregi_replace avec ta fonction je pense.
TOP Hors ligne


justement, c'est pour ça que j'ai essayé avec un sprintf ou un (int) en me disant que le pauvre typage du PHP me dispensait de ce genre de bidouille. Mais vu que ça ne donne rien ... L'intval me retourne 0 aussi.
Bon je vais essayer de trouver une autre combine ...
FYI RTFM ASAP => Tux : La Légende <=
NewsletTux
TOP Hors ligne









Ce que je propose peut paraître idiot, mais essaye un coup :
function Schema($schema)
{
return ("=> ".($schema+1)." <=");
}TOP Hors ligne


0 aussi. (alors que ma valeur d'arrivée vaut bien 45)
FYI RTFM ASAP => Tux : La Légende <=
NewsletTux
TOP Hors ligne









Malcolm a écrit:
0 aussi. (alors que ma valeur d'arrivée vaut bien 45)
Es tu certain que $schema ne contient pas d'espace ?
Essaie aussi :
function Schema($schema)
{
$nb = intval($schema)+1;
return ("=> ".$nb." <=");
}TOP Hors ligne


ça m'affiche 1. Et non, mon nombre n'a pas d'espace vu que si je l'affiche seul, il n'y a pas d'espace (même dans le code source)
Edit : ce qui est curieux, c'est queje ne l'aie pas en tant que nombre ...
voici un autre test :
function Schema($schema)
{
return (is_numeric($schema)) ? "=> ".$schema." <=" : "NaN";
}et ça m'affiche "NaN".
alors que $schema vaut bien 45. Je me demande s'il n'y a pas une couille ASCII ou qqch du genre, mais bon, les nombres en majuscule, c'est des blagues style mika 
FYI RTFM ASAP => Tux : La Légende <=
NewsletTux
TOP Hors ligne


Dis-nous ce que ça dit si tu fais :
function Schema($schema)
{
var_dump($schema);
}TOP Hors ligne


si je fais un print_r($schemas) il affiche juste un \1 (rapport à ma regexp ss doute)
si je fais un var_dump($schema) il affiche string(2) \1
d'où sort le 45 alors ...?
FYI RTFM ASAP => Tux : La Légende <=
NewsletTux
TOP Hors ligne


Premier cas :
1) eregi_replace commence par exécuter Schema('\\1').
2) Pour lui il a donc cette fonction :
$thispage['content'] = eregi_replace("\[schema\] ?([^\[]*) ?\[/schema\]", '=> \\1 <=' , $thispage['content']);3) Il remplace \\1 par la première capture de ta regexp, soit 45.
4) Dans ton template, ton 45 est donc bien remplacé par => 45 <=.
Second cas avec le +1 :
1) eregi_replace commence par exécuter Schema('\\1').
2) Pour lui il a donc cette fonction :
$thispage['content'] = eregi_replace("\[schema\] ?([^\[]*) ?\[/schema\]", '=> 1 <=' , $thispage['content']);(car \\1 est un string, donc ça vaut 0 donc +1 ça fait 1
)
3) Il remplace l'éventuel \\1 par la première capture de ta regexp, soit 45.
4) Evidemment il n'y avait plus de \\1 dans ton string de remplacement donc il a remplacé que dalle
. Par contre le 1 apparait bien.
Conclusion :
J'avais bien raison, c'est une question d'ordre : eregi_replace commence par exécuter toutes les fonctions, puis fait son boulot. Voilà pourquoi j'avais jamais utilisé ta méthode qui serait pourtant bien pratique
.
TOP Hors ligne









Oh !!! Moi je croyais que tu testais la fonction toute seule... pas dans le contexte du script 
TOP Hors ligne


j'ai trouvé une autre façon de résoufre, en fait ... J'éclate mon contenu HTML et je recherche les lignes [schéma] pour en tirer la variable. D'elle, je mets le contenu du schéma, sans passer par une autre fonction. ça fait un peu moins propre, mais tant pis.
FYI RTFM ASAP => Tux : La Légende <=
NewsletTux
TOP Hors ligne


Suffit de récupérer les valeurs avec preg_match_all par exemple et de remplacer ensuite
.
TOP Hors ligne