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 :

Conversion de # vers <ol>


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Par défaut Conversion de # vers <ol>
    Bonjour,

    Voila je vous présente mon problème

    Je dois modifier des balises pour des listes organisées (<ol>).

    Actuellement j'ai quelque chose qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #Grand 1
    #Grand 2
    ## Petit 1
    ## Petit 2
    ...
    #Grand 3
    ...

    Ce qui est sencé me donner cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <ol>
    <li> Grand 1</li>
    <li> Grand 2</li>
     
    <ol>
    <li> Petit 1</li>
    <li> Petit 1</li>
    ...
    </ol>
     
    <li> Grand 3</li>
    ...
    </ol>
    (dsl pour l'indentation)

    Comment pourrais-je procéder pour faire ces changements ?
    Un algorithme à proposer ?

    Merci

  2. #2
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Une première tentative,
    sans regex :
    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
    $entree = file('test.txt');
     
    $nbDieses = 0;
    $sortie='';
     
    foreach ($entree as $ligne) {
    	$ol='';
    	$ligne = trim($ligne);
    	$nbDiesesTrouves = substr_count($ligne, '#');
     
    	if ($nbDiesesTrouves == 0) continue;
     
    	if ($nbDieses != $nbDiesesTrouves) {
    		$ol = ($nbDieses < $nbDiesesTrouves) ? "<ol>" : "</ol>";
    		$nbDieses = $nbDiesesTrouves;
    	}
     
    	$sortie.=$ol."<li>".str_replace('#','',$ligne)."</li>";
    }
    $sortie .="</ol>";
     
    echo $sortie;
    Fred

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Par défaut
    Bonjour,

    Merci micetf pour ta réponse !

    Ton code fonctionne seulement s'il y a une ligne qui ne commence pas par un '#' les numéros continues ! ça j'ai pu le corriger en ajoutant un $i = 0; qui s'incrémente à chaque ligne

    et si le nombre de # trouvée = 0 et $i != 0 je remet nbDieses = 0

    ça c'est dans le cas d'un fichier



    mais dans le cas d'une variable ...
    penses-tu qu'un explode suivant "\n" avec un for qui parcours le tableau de résultat fonctionnerait ?
    Car quand je l'essai ça veut pas ...

    Voila le 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
     
    $entree = '
    #1
    #2
    ##2.1
    ###2.1.1
    #3
    ';
     
    $result = explode('\n', $entree);
     
    for($i = 0;$i<count($result);$i++)
    {
         //traitement de micetf
    }
    j'ai un retour sur une seule ligne ... comme si le explode n'avait pas marché ... je met donc en cause le '\n' mais par quoi le remplacer ?

    Merci encore

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Par défaut
    Rebonjour,

    Voila j'ai trouvé

    étant dans le forum "Regex" ça aurait été bête de pas les utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $result = preg_split("/[\n]+/", $entree);
    foreach ($result as $row => $value)
    {
    ....
    }
    Je vais quand même attendre un peu avant de mettre le tags "résolu" au cas ou micetf aies une autre solution à me proposer !

    Merci...

  5. #5
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Avec le explode, ça fonctionne,
    cependant il faut bien mettre le \n entre guillemets(")
    sinon,
    si on utilise les quotes('),
    PHP n'interprètera pas,
    il cherchera des suites de caractères \ et n dans la chaine
    et
    bien sûr il ne les trouvera pas.
    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
    36
    37
    38
    39
    40
    41
    <?php 
    $string = '
    #Grand 1
    #Grand 2
    ## Petit 1
    ## Petit 2
    #Grand 3
    
    #Grand 1
    #Grand 2
    ## Petit 1
    ## Petit 2
    #Grand 3
    ';
     
    $entree = explode("\n",$string);
     
    $nbDieses = 0;
    $sortie='';
     
    foreach ($entree as $ligne) {
    	$ol='';
    	$ligne = trim($ligne);
    	$nbDiesesTrouves = substr_count($ligne, '#');
     
    	if ($nbDiesesTrouves == 0) {
    		if ($nbDieses!=0) $sortie.="</ol>";
    		$nbDieses = 0;
    		continue;
    	}
     
    	if ($nbDieses != $nbDiesesTrouves) {
    		$ol = ($nbDieses < $nbDiesesTrouves) ? "<ol>" : "</ol>";
    		$nbDieses = $nbDiesesTrouves;
    	}
     
    	$sortie.=$ol."<li>".str_replace('#','',$ligne)."</li>";
    }
    $sortie .="</ol>";
     
    echo $sortie;
    Fred

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Hello,

    La regex n'est pas vraiment utile.
    Il faut savoir que les caractères spéciaux comme \n ou \t ne sont pas interprétés lorsqu'ils sont dans une chaîne encadrée par apostrophes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = explode('\n', $entree);
    ne fonctionnera pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = explode("\n", $entree);
    fonctionnera parfaitement.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Par défaut
    Sans commentaire


    je clos le sujet (ou presque)


    Lorsque j'ai un # au coeur de la chaîne il est également interprété ... or je vais traiter du html donc il se peut qu'il y ai des # ...

    j'ai donc essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = preg_split("/^#.*[\n]+/, $entree);
    mais cette expression ne marche pas ....

    pourquoi ??
    ou comment contourner ce problème ??


    merci pour la précision

Discussions similaires

  1. Conversion Unix vers DOS...
    Par nicosfly dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2008, 18h53
  2. [VBA-E] macro conversion excel vers csv
    Par baboune dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/07/2004, 10h23
  3. conversion Access vers SQL
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/03/2004, 14h57
  4. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 17h05
  5. Conversion Timestamp vers varchar
    Par stejutt dans le forum SQL
    Réponses: 4
    Dernier message: 08/01/2004, 09h46

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