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...
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...
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:
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 $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);
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)
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 :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
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: <a href="http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5279268&isnumber=5278662">http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5279268&isnumber=5278662</a><br> <br>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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2Design study and optimization of a grid independent wind/PV/Diesel system,
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).
Bon courage pour la suite
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: <a href="http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5279268&isnumber=5278662">http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5279268&isnumber=5278662</a><br> <br> LOD; echo '<code>'.htmlentities($text)."</code><br/>$text"; preg_match_all('/[^=]\s*"\s*(.*?)"/s',$text,$match); print_r($match);
(Oops, pas tout jeune ce post)
Partager