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 :

extraire les chaines de caractères encadrées par d'autres chaines de caractères


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut extraire les chaines de caractères encadrées par d'autres chaines de caractères
    Bonjour,

    je dispose d'une très longue chaîne de caractères, et je voudrais en extraire toutes les sous-chaines encadrées par ," <i> et par ," <i> ; c'est probablement enfantin si on maîtrise les regex, mais ce n'est pas mon cas...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Logiquement, on utilise DOMDocument ou SimpleXML pour extraire des données d'un flux HTML.

    Mais bon, à titre didactique, voici comment extraire tous les tags d'une chaîne de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $body = <<< BODY
    Lorem ipsum <i>dolor</i> sit amet, consectetur adipiscing elit. Aenean auctor viverra tellus sit amet lobortis. Phasellus volutpat condimentum nisi in fermentum. Mauris sed sem ut <b>erat</b> pretium vestibulum. Suspendisse potenti. Nulla bibendum, sem at ultricies viverra, nibh lectus tempus orci, id rhoncus ligula leo ultricies urna. Sed vitae sapien dolor. Proin varius odio quis augue mollis non pretium magna aliquet. Maecenas <em>dapibus</em> iaculis magna, elementum aliquam lorem mollis id. Vestibulum vel dolor sed ligula sagittis vulputate et id neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis <span>egestas</span>. Aenean volutpat nunc non elit vestibulum imperdiet nec quis ligula.
    BODY;
     
    echo $body;
     
    preg_match_all('~<([^>]+)>(.+)</\1>~', $body, $matches);
     
    var_dump($matches);
    Dans le tableau $matches, l'offset 1 caractérise les noms des tags (i, b, em etc.) et l'offet 2 caractérise leur valeur:

    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
    array
      0 => 
        array
          0 => string '<i>dolor</i>' (length=12)
          1 => string '<b>erat</b>' (length=11)
          2 => string '<em>dapibus</em>' (length=16)
          3 => string '<span>egestas</span>' (length=20)
      1 => 
        array
          0 => string 'i' (length=1)
          1 => string 'b' (length=1)
          2 => string 'em' (length=2)
          3 => string 'span' (length=4)
      2 => 
        array
          0 => string 'dolor' (length=5)
          1 => string 'erat' (length=4)
          2 => string 'dapibus' (length=7)
          3 => string 'egestas' (length=7)

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Je réinterviens car malgré l'aide reçue, je ne suis pas arrivé à mes fins. Je précise mon besoin ; j'ai une longue liste d'articles (sous forme de html) ; les articles sont de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Belfkira, R.; Barakat, G.; Nicolas, T.; Nichita, C.; , " Design study
    and optimization of a grid independent wind/PV/Diesel system," <i>Power
    Electronics and Applications, 2009. EPE '09. 13th European Conference on</i>
    , vol., no., pp.1-10, 8-10 Sept. 2009<br>
    URL:&nbsp;<a
     href="http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=5279268&amp;isnumber=5278662">http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=5279268&amp;isnumber=5278662</a><br>
    <br>
    Dans cette liste, il y en a 103 de ce genre, et ce que je voudrais extraire pour chacun, c'est le titre, comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Design study
    and optimization of a grid independent wind/PV/Diesel system,
    Comme à chaque fois, le titre est encadré par , " et par ," , j'ai pris le texte entier et y ai remplacé la première chaîne par <ii> et la deuxième par </ii> (des tags qui n'existent pas) avec pour idée d'appliquer l'algorithme donné ; non seulement, il en trouve bien moins que 103, mais il n'y a pas que les titres vu qu'il y a d'autres tags. Comme les chaînes de caractères qui encadrent les titres sont uniques, il doit y avoir moyen d'extraire ceux-ci, mais comment faire ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Bonjour,

    pour parser avec preg_match_all, il y a des trappes à identifier.
    Dans l'exemple que tu as donné, j'en ai vues deux, mais il y en aura surement d'autres dans ta liste.
    1) Le plus vicelard car il faut le savoir: ta pattern ne sera recherchée que sur une seule ligne sauf si tu ajoutes /s à la fin pour permettre une recherche sur plusieurs lignes, sinon:
    " Design study
    and optimization
    of a grid independent wind/PV/Diesel system,"
    ne sera pas 'matché'.
    2) Les attributs des balises html sont également entre guillemets. Pour les éviter, j'ai exclu les patterns précédées d'un = avec un nombre indéterminé d'espaces ou retours chariot (le html étant très tolérant là dessus).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $text=<<<LOD
    			Belfkira, R.; Barakat, G.; Nicolas, T.; Nichita, C.; , " Design study
    and optimization of a grid independent wind/PV/Diesel system," <i>Power
    Electronics and Applications, 2009. EPE '09. 13th European Conference on</i>
    , vol., no., pp.1-10, 8-10 Sept. 2009<br>
    URL:&nbsp;<a
     href="http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=5279268&amp;isnumber=5278662">http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=5279268&amp;isnumber=5278662</a><br>
    <br>
    LOD;
    echo '<code>'.htmlentities($text)."</code><br/>$text";
    preg_match_all('/[^=]\s*"\s*(.*?)"/s',$text,$match);
    print_r($match);
    Bon courage pour la suite
    (Oops, pas tout jeune ce post)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Sed : Remplacement de chaines par d'autres avec des caractères spéciaux
    Par argoet dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 28/09/2011, 12h50
  2. Réponses: 4
    Dernier message: 10/09/2008, 13h53
  3. Remplacer chaine de caractères par une autre chaine
    Par unmaxdemily dans le forum SAS Base
    Réponses: 2
    Dernier message: 25/06/2008, 09h11
  4. Réponses: 1
    Dernier message: 06/08/2007, 03h23
  5. Remplacer certains caractères (accentués) par d'autre
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 24/07/2007, 13h05

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