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 :

Intégrer des "span" [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut Intégrer des "span"
    Bonjour

    j aimerais intégrer des spans entre les mots d un texte au format HTML

    je m explique , si j ai un texte sous cette forme , il faut intégrer des spans avec des ID unique pour chacun tout en gardant la forme initiale du texte en HTML

    Exp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <div>
     <div class="lc">
      <h2 class="what">
       Salut à tous</h2>
      <p>
       <strong>Il faut faire</strong> quelsue chose pour que ca marche <p>
     </div>
    je veux avoir un texte de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <div>
     <div class="lc">
      <h2 class="what">
       <span id="word_1">Salut </span><span id="word_2">à </span><span id="word_3">tous</span></h2>
      <p>
       <strong><span id="word_4">Il</span><span id="word_5">faut</span><span id="word_6">faire</span></strong><span id="word_7">quelque</span><span id="word_8">chose</span><span id="word_9">pour</span><span id="word_10">que</span><span id="word_11">ca</span><span id="word_12">marche</span><p>
     </div>
    Merci d avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 21
    Par défaut
    Alors pour pas t'embrouiller (si j'ai bien compris).

    1 - Lis ton fichier ligne par ligne et stock tout dans un tableau avec file() (à vérifier).

    2 - Découpe tes mots à chaque espace avec preg_split:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau = preg_split('/ /',$liste);
    3 - Tu fais une boucle, et tu encadres chaque mots par ton span, avec un id que tu incrémentes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mot[$i] = '<span id="word' . $i . '">' . $mot[$i] . '</span>';
    Après si tu veux tout remettre dans le fichier, tu écris une fois chaque ligne traitée.

    Avec quelques recherches google ça devrait plus être bien dur maintenant

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut
    Merci de votre réponse


    Mais le problème c est qu'avec cette méthode je risque de perdre la structure initiale de mon texte HTML.

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bonjour,

    J'ai fait ceci pour un début de piste.

    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
    <?php
     
    $str = <<< END
    <div>
     <div class="lc">
      <h2 class="what">
       Salut à tous</h2>
      <p>
       <strong>Il faut faire</strong> quelsue chose pour que ca marche <p>
     </div>
    END;
     
    $reg = '/>([^<]+)</';
     
    preg_match_all($reg, $str, $m);
     
    //print_r($m[1]);
     
    foreach($m[1] as $m) {
    	if (!trim($m)) continue;
    	$buffer = split(' ', $m);
    	foreach($buffer as $word)
    		if(trim($word)) $words[] = $word;
    }
     
    foreach($words as $word)
    	$str = preg_replace("/($word)/", '<span>$1</span>', $str);
     
    print_r($str);

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour zaiim,

    Je ne suis pas intervenu jusqu'à présent parce que je ne sais pas écrire mon code en PHP.
    Mais comme tu as relancé ta question, je me décide à mettre ma solution en Python. Tu pourras t'en inspirer si ça te convient.




    Le truc, c'est que je splite selon un motif '#((?:<.+?>\s*)+)#' (écrit façon PHP, mais en Python on ne met pas de délimiteurs #)
    qui permet d'isoler exactement les chaînes qui doivent être modifiées, en mettant à l'écart y compris les fin de ligne '\n' et autres caractères de la catégorie des caractères d'espacement. Il ne reste plus qu'à spliter chaque isolat pour en séparer les mots et entourer ceux-ci dans une balise.

    Ce split avec ce motif pemet de traiter un texte dans lequel il y a des fins de ligne '\n' au sein de portions situées entre deux balises (c'est à dire des portions à modifier) sans que ces '\n' soient éliminés.
    Je crains que ce soit par contre ce qui se passe avec le trim() dans le code de snafu.


    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
    import re
     
    ch = '''<div>
     <div class="lc">
      <h2 class="what">
       Salut à tous</h2>
      <p>
       <strong>Il faut faire</strong> quelsue chose pour que ca marche <p>
     </div>'''
     
    pat = re.compile('((?:<.+?>\s*)+)')
    liS = pat.split(ch)
     
    n = 1
    patmot = re.compile('[^ ]+ ?')
    for s in xrange(0,len(liS),2):
        lispaned = []
        for m in patmot.finditer(liS[s]):
            lispaned.append('<span id="word_'+str(n)+'">'+m.group()+'</span>')
            n += 1
        liS[s] = ''.join(lispaned)
     
    ch_spaned = ''.join(liS)


    pat.split(ch) splite la chaîne ch selon le motif de la regex.
    En mettant le motif entre parenthèses, les groupes capturés sont aussi éléments de la liste résultante liS.
    On obtient ainsi mise dans une liste la totalité de la chaîne découpée selon le motif:
    les portions qui matchent avec le motif se retrouvent aux positions 1,3,5,7,etc, tandis que les portions hors motif (celles qui nous intéressent pour les modifier) se retrouvent en positions 0,2,4,6,etc.

    Dans le cas de ta chaîne, la longueur de liS est 9.
    xrange(0,9,2) est la suite de valeurs 0,2,4,6,8.
    for s in xrange(0,len(liS),2):
    permet donc d'itérer sur les portions à modifier

    patmot.finditer(liS[s]) est un itérateur qui débite les mots de la portion liS[s]

    lispaned récupère les mots de liS[s] spanés
    ''.join(lispaned) en refait une chaîne

    liS[s] = ''.join(lispaned) remplace la valeur de la portion liS[s] par la chaîne dans laquelle les mots sont au sein d'une balise span

    ''.join(liS) aggrège tous les élements de liS en une chaîne, dont l'affichage produit ce que tu attends.

    Il reste à traduire ça en PHP.





    Pour mieux saisir ce qui se passe:
    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
    import re
     
    ch = '''<div>
     <div class="lc">
      <h2 class="what">
       Salut à tous</h2>
      <p>
       <strong>Il faut faire</strong> quelsue chose pour que ca marche <p>
     </div>'''
     
    pat = re.compile('((?:<.+?>\s*)+)')
    liS = pat.split(ch)
    print 'liS =\n','['+'\n'.join(repr(u) for u in liS)+']'
    print '\nlen(liS) =',len(liS)
    print
    n = 1
    patmot = re.compile('[^ ]+ ?')
    for s in xrange(0,len(liS),2):
        print '\nliS['+str(s)+'] =',repr(liS[s])
        lispaned = []
        for m in patmot.finditer(liS[s]):
            lispaned.append('<span id="word_'+str(n)+'">'+m.group()+'</span>')
            n += 1
        print 'lispaned =\n',lispaned
        print "''.join(lispaned) =\n",repr(''.join(lispaned))
        liS[s] = ''.join(lispaned)
     
    print
    print
    ch_spaned = ''.join(liS)
    print ch_spaned

    liS =
    [''
    '<div>\n <div class="lc">\n <h2 class="what">\n '
    'Salut \xe0 tous'
    '</h2>\n <p>\n <strong>'
    'Il faut faire'
    '</strong> '
    'quelsue chose pour que ca marche '
    '<p>\n </div>'
    '']

    len(liS) = 9


    liS[0] = ''
    lispaned =
    []
    ''.join(lispaned) =
    ''

    liS[2] = 'Salut \xe0 tous'
    lispaned =
    ['<span id="word_1">Salut </span>', '<span id="word_2">\xe0 </span>', '<span id="word_3">tous</span>']
    ''.join(lispaned) =
    '<span id="word_1">Salut </span><span id="word_2">\xe0 </span><span id="word_3">tous</span>'

    liS[4] = 'Il faut faire'
    lispaned =
    ['<span id="word_4">Il </span>', '<span id="word_5">faut </span>', '<span id="word_6">faire</span>']
    ''.join(lispaned) =
    '<span id="word_4">Il </span><span id="word_5">faut </span><span id="word_6">faire</span>'

    liS[6] = 'quelsue chose pour que ca marche '
    lispaned =
    ['<span id="word_7">quelsue </span>', '<span id="word_8">chose </span>', '<span id="word_9">pour </span>', '<span id="word_10">que </span>', '<span id="word_11">ca </span>', '<span id="word_12">marche </span>']
    ''.join(lispaned) =
    '<span id="word_7">quelsue </span><span id="word_8">chose </span><span id="word_9">pour </span><span id="word_10">que </span><span id="word_11">ca </span><span id="word_12">marche </span>'

    liS[8] = ''
    lispaned =
    []
    ''.join(lispaned) =
    ''


    <div>
    <div class="lc">
    <h2 class="what">
    <span id="word_1">Salut </span><span id="word_2">à </span><span id="word_3">tous</span></h2>
    <p>
    <strong><span id="word_4">Il </span><span id="word_5">faut </span><span id="word_6">faire</span></strong> <span id="word_7">quelsue </span><span id="word_8">chose </span><span id="word_9">pour </span><span id="word_10">que </span><span id="word_11">ca </span><span id="word_12">marche </span><p>
    </div>

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut
    Merci a vous tous

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

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