Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/06/2011, 16h33   #1
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Par défaut Récupérer une portion d'une div

Bonjour à tous,

Dans le code suivant, j'aimerais récupérer les éléments suivants avec preg_match :

h1, div.article_metadata, div#article_body

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<div id="article_holder">
	<h1>title1</h1>
	<div class="article_metadata">
		<span class="metadata_time">2011.06.08</span>
		<div class="article_auth">
			<img src="http://www.echoroukonline.com/ara/themes/rtl/img/fleche_orange.gif">name
		</div>
	</div>
	<div id="article_body">
		<p class="abstract"><strong></strong></p>
		<ul dir="rtl">
			<li><div></div></li>
			<li><div></div></li>
			<li><div></div></li>
			<li><div></div></li>
			<li><div></div></li>
		</ul>
	</div>
	<div id="autre"></div>
	<p class="nbreads"></p>
</div>
Comment faire cela ?

Merci.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 16h40   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
pour parser du HTML c'est DOMDocument
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/06/2011, 17h29   #3
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Citation:
Envoyé par stealth35 Voir le message
pour parser du HTML c'est DOMDocument
J'ai déjà utiliser le dom et xpath, mais j'ai un problème de codage.

Parce que dans l'affichage du résultat (il est en arabe), j'ai des caractères bizarre.

Citation:
تصريØ*ات مثيرة للشغب
2011.06.08 سالم زواوي
على الرغم من Ø*ساسية المرØ*لة ÙˆØ*ساسية الأوضاع على كل الجبهات ÙÙŠ الجزائر، وعلى الرغم من ترشØ* هذا الوضع Ù„Ù„Ø§Ù†ÙØ¬Ø§Ø± السياسي والاجتماعي ÙÙŠ أي Ù„Ø*ظة، ÙØ¥Ù† الوزير الأول السيد Ø£Ø*مد أويØ*يى يواصل
Vois-tu pourquoi j'ai essayé d'avoir un résultat lisible avec preg_match ?
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 17h32   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
ton script est bien en utf-8 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h14   #5
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Oui, le fichier est sauvegardé en UTF8 Without BOM.

Code :
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
header('Content-Type: text/html; charset=UTF-8');
//<!--meta http-equiv="Content-Type" content="text/html; charset=utf-8" /--> 
set_time_limit(0);
 
$sUrl = 'http://www.echoroukonline.com/ara/editorial/index.1.html';
$sUrlSrc = getWebsiteContent($sUrl,0);
 
// Load the source
$dom = new DOMDocument("UTF-8");
@$dom->loadHTML($sUrlSrc);
 
$xpath = new DomXPath($dom);
 
// ===================================      step 1 - links:
 
$vRes = $xpath->query("/html/body/div/div[2]/div/div[2]/div[4]/div/div/div/h2/a");
 
// ===================================      step 2 - titles:
 
$aLinks = $vRes->item(0)->getAttribute("href");
 
echo "<br />aLinks : ".$aLinks."<br />";
$sUrl2 = 'http://www.echoroukonline.com/ara/'.$aLinks;
 
echo "<br />sUrl2 : ".$sUrl2."<br />";
$sUrlSrc2 = getWebsiteContent($sUrl2,1);
 
@$dom->loadHTML($sUrlSrc2);
$xpath = new DomXPath($dom);
 
// ===================================      step 3 - titles:
 
$vRes = $xpath->query(".//*[@id='article_holder']/h1");
$aTitles= $vRes->item(0)->nodeValue;
 
// ===================================      step 4 - Metas:
 
$vRes = $xpath->query(".//*[@class='article_metadata']");
$aMetas= $vRes->item(0)->nodeValue;
 
//====================================      step 5 - descriptions:
 
$vRes = $xpath->query(utf8_encode(".//*[@id='article_body']"));
$aDescriptions= $vRes->item(0)->nodeValue;
 
//=============================
 
echo '<link href="css/styles.css" type="text/css" rel="stylesheet"/><div class="main">';
echo '<h1>Using xpath for dom html</h1>';
 
//echo "<br />".$aTitles."<br />".$aMetas."<br />".$aDescriptions."<br />";
 
echo "
<div class='unit'>
    <a href='{$sUrl2}'>{$aTitles}</a>
    <div>{$aMetas}</div>
    <div>{$aDescriptions}</div>
</div>";
 
echo '</div>';
 
// this function will return page content using caches (we will load original sources not more than once per hour)
function getWebsiteContent($sUrl,$f=0) {
 
	// our folder with cache files
    $sCacheFolder = 'cache';
 
    if(!is_dir($sCacheFolder)){
        mkdir($sCacheFolder,0777);
    }
 
    // cache filename
    if ($f == 0) {
        $sFilename = 'ech-'.date('YmdHi').'.html';
    } else {
        $sFilename = 'eftch-'.date('YmdHi').'.html';
    }
 
    if (!file_exists($sCacheFolder."/".$sFilename)) {
        $ch = curl_init($sUrl);
        $fp = fopen($sCacheFolder."/".$sFilename, 'w');
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, Array('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15'));
        curl_close($ch);
        fclose($fp);
    }
    //return file_get_contents($sCacheFolder.$sFilename);
    return file_get_contents_utf8($sCacheFolder."/".$sFilename);
 
 
}
function file_get_contents_utf8($fn) {
     $content = file_get_contents($fn);
     return mb_convert_encoding($content, 'UTF-8',
         mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true)
            );
}
 
?>
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h24   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
ton file_get_contents_utf8 sert a rien le site est déjà en utf-8
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h42   #7
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
D'où vient le problème à ton avis ?
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 18h43   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
réencode pas en utf-8
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 02h05   #9
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Le code php est à nouveau sauvegardé sous encodage ANSI.

Testé.

Même problème d'affichage du rendu
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 11h05   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par apt Voir le message
Le code php est à nouveau sauvegardé sous encodage ANSI.

Testé.

Même problème d'affichage du rendu
fallait laisser l'utf-8, mais as tu bien enlever ta fonction file_get_contents_utf8 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 00h35   #11
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Citation:
Envoyé par stealth35 Voir le message
fallait laisse l'utf-8, mais a tu bien enlever ta fonction file_get_contents_utf8 ?
Oui, je l'ai enlevé...mais rien de nouveau
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 12h08   #12
Membre actif
 
Avatar de hazamor
 
Homme
Développeur Web
Inscription : décembre 2008
Messages : 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2008
Messages : 179
Points : 199
Points : 199
Envoyer un message via MSN à hazamor
Je croix que c'est plus simple parser ce document HTML comme étant un XML, mais si vous voulez utiliser les expressions régulières alors ce code :

Code :
1
2
3
4
5
6
7
8
//pour h1
preg_match ('!<div id="article_holder">\s*<h1>(.*?)</h1>!s'  , $ch , &$matches1)
 
//pour div.article_metadata
preg_match ('!<div class="article_metadata">(.*?)</div>\s*<div id="article_body">!s'  , $ch , &$matches2)
 
//pour div#article_body
preg_match ('!<div id="article_body">(.*?)</div>\s*<div id="autre">!s'  , $ch , &$matches3)
hazamor est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 12/06/2011, 16h18   #13
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Citation:
Envoyé par hazamor Voir le message
Je croix que c'est plus simple parser ce document HTML comme étant un XML, mais si vous voulez utiliser les expressions régulières alors ce code :
Ça marche très bien, merci hazamor .

mais j'aimerais bien aussi utiliser la solution du dom si tu permets
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2011, 16h47   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par apt Voir le message
Ça marche très bien, merci hazamor .

mais j'aimerais bien aussi utiliser la solution du dom si tu permets
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$url = 'http://www.echoroukonline.com/ara/editorial/index.1.html';
 
$context = stream_context_create(array(
    'http' => array(
        'user_agent' => 'PHP',
        'header' => 'Accept: text/html'
    )
));
 
libxml_set_streams_context($context);
libxml_use_internal_errors(true);
 
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
 
libxml_clear_errors();
 
$xpath = new DOMXPath($doc);
 
$query = $xpath->query('//h1');
$h1 = utf8_decode($query->item(0)->nodeValue);
 
var_dump($h1);

par contre les div n'existent pas dans le code source
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 22h00   #15
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Citation:
Envoyé par stealth35 Voir le message
[code]
par contre les div n'existent pas dans le code source
Ca veut dire qu'avec le DOMDocument on ne peut avoir des portions de code du document html ?
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 10h03   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par apt Voir le message
Ca veut dire qu'avec le DOMDocument on ne peut avoir des portions de code du document html ?
mais non
regarde bien , div.article_metadata, div#article_body n'existent pas
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 19h15   #17
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Citation:
Envoyé par stealth35 Voir le message
mais non
regarde bien , div.article_metadata, div#article_body n'existent pas


Tu veux dire dans la variable $doc ?

Si c'est le cas, comment vérifier l'existence des div en questions ?
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 19h22   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par apt Voir le message


Tu veux dire dans la variable $doc ?

Si c'est le cas, comment vérifier l'existence des div en questions ?
non dans ta page HTML d'origine
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 19h40   #19
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Ah oui

Ce lien contient la listes de tout les articles :

http://www.echoroukonline.com/ara/ed...l/index.1.html

Mais dont je veux récupérer le contenu ce trouve dans le dernier article ajouté (le premier dans la liste), à savoir :

http://www.echoroukonline.com/ara/editorial/77456.html
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h59.


 
 
 
 
Partenaires

Hébergement Web