Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/10/2012, 11h00   #1
laurentSc
Débutant
 
Homme Laurent
Webmaster débutant
Inscription : octobre 2006
Messages : 3 494
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 49
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster débutant
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 3 494
Points : 1 693
Points : 1 693
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
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2012, 14h28   #2
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 896
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 896
Points : 8 600
Points : 8 600
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 :
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 :
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)
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2012, 23h00   #3
laurentSc
Débutant
 
Homme Laurent
Webmaster débutant
Inscription : octobre 2006
Messages : 3 494
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 49
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster débutant
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 3 494
Points : 1 693
Points : 1 693
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 :
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 :
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
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2012, 03h11   #4
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 129
Points : 129
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 :
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)
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h26.


 
 
 
 
Partenaires

Hébergement Web