Adapter une regex

azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010 - 16 juil. 2008 à 20:52
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 22 nov. 2008 à 21:42
Je cherche à faire un truc qui pourrait etre résumé par ca:

$texte_a_afficher = preg_replace('#\[(.+)=(.+)\]#i', include('blocks/$1.php?valeur=$2'), $texte_a_afficher);

...bien que  cette regex soit fausse.

Je ne sais pas vraiment comment m'y prendre mais j'espère que vous pourrez m'aiguiller.

Merci

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.

26 réponses

codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
21 juil. 2008 à 11:50
La variable $valeur n'existe pas dans la fonction Replace car elle n'a pas la portée globale.
C'est d'ailleur pour cela que l'on utilise les fonction ob_*, pour déclarer des variables et les exploiter. Si tu à plusieurs variables, en plus que celle que tu voulais appeler (page.php?valeur=ici), alors la méthode d'appel dans la fonction n'est pas possible, il faudra que tu fasse un preg_match_all et ensuite tu boucle sur le tableau de valeur récupérée

preg_match_all ('tonpattern', $tonTexte, $aMatches); // Il me semble que c'est cette syntaxe, à vérifier sur php.net
foreach ($aMatches as $aElements) {
   $valeur = $aElements[2];
   include './folder/'.$aElements[1].'.php';
}

et dans cette méthode tu bénéfiera de toutes variables préalablement déclarée dans ton script.

http://www.ReFlectiv.Net
0
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
18 nov. 2008 à 22:00
Bonjour,

je relance ce sujet car je viens de retomber sur mon problème (que je n'ai jamais résolu) et j'ai quelques éléments nouveau:

function form ($aMatches) {
    if (file_exists ('blocks/'.$aMatches[1]) && is_readable ('blocks/'.$aMatches[1])) {
        ob_start ();
        include ('blocks/'.$aMatches[1].'.php');
        $sContent = ob_get_contents ();
        ob_end_flush ();
        return $sContent;
    }
    else
        return $aMatches[0];
}

$texte_a_afficher = preg_replace_callback ('#\[([^\=]+)=([^\]]+)\]#i', form ($aMatches), $texte_a_afficher);

Avec ces paramètres, j'obtiens les erreurs suivantes:

Warning : include(blocks/.php) [function.include]: failed to open stream: No such file or directory in C:\wamp\www\bastion\blocks\fonction.php on line 43

Warning: include() [function.include]: Failed opening 'blocks/.php' for inclusion (include_path ='.;C:\php5\pear') in C:\wamp\www\bastion\blocks\fonction.php on line 43

Warning: preg_replace_callback() [function.preg-replace-callback]:
Requires argument 2, '

Warning: include(blocks/.php) [function.include]: failed to open
stream: No such file or directory in
C:\wamp\www\bastion\blocks\fonction.php on line
43



Warning: include() [function.include]: Failed opening
'blocks/.php' for inclusion (include_path='.;C:\php5\pear') in
C:\wamp\www\bastion\blocks\fonction.php on line
43

', to be a valid callback in C:\wamp\www\bastion\blocks\fonction.php on line 33

La première erreur indique que $aMatches est vide, et les deuxième est je pense un conséquence de la première. Reste la dernière, celle qui revient depuis le début de mon problème.

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
19 nov. 2008 à 14:15
Yop

Ca doit être ta regex qui n'est pas bonne, essaye de procéder par étape, chopper un morceau, puis en ajouter un peu plus, etc.

Tout d'abord, extrait ta regex et teste là sur une chaine directement, juste un preg_match () et un var_dump du résultat, afin de voir ce que ca donne (tu fait un var_dump du résultat et tu cherche petit à petit la regex qui fonctionne).

Et avance petit à petit en faisant des tests avec ta chaine et ta regex

http://www.ReFlectiv.Net
0
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
21 nov. 2008 à 19:08
En partant de ce script:
<?php
$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;

?>

J'ai créer:

<?php
$texte_a_afficher="Salut,

Voici une page sur l'oganisation des listes

[test=page]

Le cours est fini

";

function inclusion_page($masque)
{
include($masque[1].".php");
}
$texte_a_afficher=preg_replace_callback('#\[([^\=]+)=([^\]]+)\]#i','inclusion_page',$texte_a_afficher);

echo $texte_a_afficher;

?>

Tous fonctionne à un détails près, l'include se passe avant l'affichage du texte et non au milieu.

Comment contourné le problème ?

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
22 nov. 2008 à 12:32
Je m'approche de la solution avec des bouts de script que codefalse m'a donné:

function inclusion_page($masque)
{
            if (file_exists ('blocks/'.$masque[1].'.php') && is_readable ('blocks/'.$masque[1].'.php')) {
            ob_start ();
            include ('blocks/'.$masque[1].'.php');
            $sContent = ob_get_contents ();
            ob_end_flush ();
            return $sContent;
        }
        else
        {
        return "Aucun fichier ne peut être inclus !";
        }
}

Si il n'y a pas de fichier correspondant, ca marche très bien. En revanche, si un fichier existe, il l'inclus non seulement à sa place, mais aussi au dessus du texte.

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
22 nov. 2008 à 21:42
il ne faut pas que tu le retourne, il faut que tu récupere la valeur, et que tu remplace [test=page] par sa valeur. Donc apres le ob_end_flush, tu fait un preg_replace (bien qu'un str_replace devrait suffire, à vérifier)

http://www.ReFlectiv.Net
0
Rejoignez-nous