IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Scanner "<p>&nbsp;</p>" avec preg_match_all [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut Scanner "<p>&nbsp;</p>" avec preg_match_all
    Bonsoir !!!

    Après avoir cherché pendant un bon moment seul et sur les forums je n'ai pas réussi à trouver le motif qui correspond à ce que je veux...

    Je souhaiterais que ma chaine soit coupée à chaque fois que le motif est trouvé... Le but étant d'insérer une image entre chaque partie de chaîne.

    Voici une portion de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    $contenu = '<p>Exemple de chaîne<p><p>&nbsp;</p><p>Qui doit être coupée.</p>';
    $img = array(0 => '00.jpg', 1=> '01.jpg'); // tableau d'images
    $chaine = ""; // chaîne finale à renvoyer
    $chaines = array(); // tableau de sous-chaînes
    $chaine_img = ""; 
    preg_match_all('#<p>&nbsp;</p>#', $contenu, $chaines);
     
    $nb_img_affichees = 0;
     
    for ($i=0; $i<sizeof($chaines); $i++) {
     
    	if (isset($img[$nb_img_affichees])) {
     
                $chaine_img .= "<img src=\"img/mini/".$img[$nb_img_affichees]."\" />";
                $chaines[$i] = $chaine_img.$chaines[$i];
                $nb_img_affichees++;
     
            }
     
    }
     
    foreach ($chaines as $chaine_value) {
     
    	$chaine .= $chaine_value;
     
    }
     
    return html_entity_decode($chaine);

    Si vous pouviez m'aider... D'avance merci !

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    tu veux dire que tu veux remplacer '<p>&nbsp;</p>' par une image de ton tableau $img en les mettant une par une ?

    Si c'est bien ça, l'utilisation de preg_replace_callback me semble plus appropriée si tu tiens à utiliser des expressions régulières (sinon, plus simplement, tu peux toujours passer par strpos et substr_replace)

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Oui... Mais le code étant déjà fait je voudrais simplement qu'on me donne le bon motif. Au départ j'utilisais explode() pour scinder la chaîne en sous-chaînes mais je me suis rendu compte que ce n'était pas adapté...

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Eh bien en fait, ton pattern fonctionne, mais il ne fait que capturer "<p>&nbsp;</p>" quand il le rencontre... (si tu fais un var_dump($chaines), tu verras que c'est un tableau qui contient bien à l'index [0][0] la chaîne <p>&nbsp;</p>).

    Pour faire un remplacement, tu auras beaucoup de mal avec preg_match_all, qui n'est vraiment pas fait pour ça. La meilleure façon d'y arriver avec cette fonction serait de récupérer l'offset des éléments trouvés en utilisant l'option PREG_OFFSET_CAPTURE. Mais dans ce cas, je ne vois pas tellement l'intérêt par rapport à strpos.

    Donc mon conseil serait plutôt d'utiliser strpos et substr_replace. Si vraiment tu veux utiliser une expression régulière, alors utilises plutôt preg_replace_callback (et ce que tu veux faire ressemble alors beaucoup à ce qui est fait dans cette discussion)

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    OK... J'ai suivi ton conseil mais voilà... strpos ne me renvoi pas les positions des sous-chaînes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $positions_chaines = array();
    $motif = true;
     
    while ($motif == true) {
     
    	if (is_numeric(strpos($contenu, '<p>&nbsp;</p>'))) {
     
    		$positions_chaines[] = strpos($contenu, '<p>&nbsp;</p>');
     
    	}
    	else $motif = false;
     
    }
    Si je fais un print_r($positions_chaines) je m'aperçois que le tableau est vide..

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Attention, avec ton exemple, tu pars dans une boucle infinie, puisque strpos trouvera recommencera toujours sa recherche à partir du début de la chaine.

    Tu peux faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $contenu = '<p>Exemple de chaîne<p><p>&nbsp;</p><p>Qui doit être coupée.</p>';
     
    $positions_chaines = array();
    $offset = -1;
    while ($offset !== false)
    {
        $offset = strpos($contenu, '<p>&nbsp;</p>', $offset + 1);
        if ($offset !== false)
        {
            $positions_chaines[] = $offset;
        }
    }
     
    var_dump($positions_chaines);

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Oui... J'avais modifié entre temps :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    $motif = true;
    $start = 0;
    $i = 0;
     
    while ($motif == true) {
     
    	if (is_numeric(strpos($contenu, '<p>&nbsp;</p>'))) {
     
    		$positions_chaines[] = strpos($contenu, '<p>&nbsp;</p>', $start);
    		$start = $positions_chaines[$i]++;
     
    	}
    	else $motif = false;
     
    	$i++;
     
    }
     
    var_dump($positions_chaines);
    Ni ton code ni le mien marche (il manquait l'incrémentation de offset dans le tien au passage )

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Je l'ai testé avec la chaîne '<p>Exemple de chaîne<p><p>&nbsp;</p><p>Qui doit être coupée.</p>', et ça fonctionne bien chez moi...

    Est-tu sûr que ton contenu contient bien <p>&nbsp;</p> et pas d'autres caractères ?

    Edit : non, non, il ,ne manque pas d'incrémentation dans le code que j'ai fourni, il fonctionne tel quel (essaies-le seul, et tu verras ce que ça donne )

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Je viens de le faire. En effet ça marche... Le problème vient de mon texte $contenu qui est bien évidemment différent de l'exemple

    Le texte $contenu est stocké en bdd sous cette forme :

    Duis elementum tortor non arcu. Nam commodo neque et nisi. Pellentesque diam velit, ultrices ut, egestas eget, imperdiet vel, dolor.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Nunc a pede. Donec tellus turpis, sollicitudin quis, vulputate et, viverra vel, dui. In hac habitasse platea dictumst.
    Où '<p>&nbsp;</p>' devient &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;

    Et c'est reparti pour chercher...

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Voilà, résolu !

    Le code s'il peut aider quelqu'un :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    $contenu = '<p>Exemple de chaîne<p><p>&nbsp;</p><p>Qui doit être coupée.</p>';
     
    $positions_chaines = array();
    $offset = -1;
    while ($offset !== false)
    {
        $offset = strpos($contenu, '<p>&nbsp;</p>', $offset + 1);
        if ($offset !== false)
        {
            $positions_chaines[] = $offset;
        }
    }
     
    $nb_img_affichees = 0;
     
    for ($i=0; $i<sizeof($positions_chaines); $i++) {
     
    	if (isset($img[$nb_img_affichees])) {
     
                $chaine_img .= "<img src=\"img/mini/".$img[$nb_img_affichees]."\" />";
                $chaines[$i] = $chaine_img.substr($contenu, $positions_chaines[$i]);
                $nb_img_affichees++;
     
            }
     
    }
     
    foreach ($chaines as $chaine_value) {
     
    	$chaine .= $chaine_value;
     
    }
     
    return $chaine;
    Dans mon cas il m'a fallu utiliser $contenu = html_entity_decode($contenu) au tout début du script pour que les balises html soient décodées

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Je n'y pense que maintenant, mais avec explode ça sera vraiment beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chaines = explode('<p>&nbsp;</p>', $contenu);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quotes dans TFilenameEdit (RXLib)
    Par AnnSo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/01/2003, 20h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo