Discussion:
regex pour isoler le contenu d'un body
(trop ancien pour répondre)
SuperG2
2008-02-04 19:25:29 UTC
Permalink
Bonjour

Alors la, je marche sur la corde raid ... Admirez l'équilibriste ... :)

Une regex ... oui oui, ce mot barbare que j'ai lu il y a deux ans ... Ce mot
qui me faisiat pensé que ... le jour ou je le comprendrais je pourais peut
être dire que je connais un piti peu le PHP ... :p

Et bien voilà, je suis en plein dedant :)

J'utilise un logiciel CMS pour rédiger un contenu à mettre en ligne, et la
seule solution pour rendre le travail propre serait que j'arrive a récupérer
le contenu alors généré ... (Un sacré bordel lol)

Comment alors pourais je récupérer le body, son contenu et le /body pour
laisser se mourir notre pauvre doctype préconfiguré ainsi que les données du
head :p

Merci de vos avis éclairés, en attendant je vais allumer la lumière ;-)

Super G2 en mode aille ma nuque, c'est pas possible !
Olivier Miakinen
2008-02-04 19:44:02 UTC
Permalink
Une regex ... oui oui, ce mot barbare que j'ai lu il y a deux ans ... [...]
Comment alors pourais je récupérer le body, son contenu et le /body pour
laisser se mourir notre pauvre doctype préconfiguré ainsi que les données du
head :p
En toute généralité, pour parser du (X)HTML, il faut plus que des
regexp. Mais si c'est juste pour récupérer ce qui va de <body> à
</body> tu peux faire par exemple :

$body = preg_replace('|.*(<body>.*</body>).*|s', '$1', $document);

À adapter si jamais tu risques de rencontrer des <BODY> ou des < body >
et que tu veuilles les accepter.
SuperG2
2008-02-04 23:42:02 UTC
Permalink
Merci de ta réponse, si tu as le temps, tu peu essayer de me la traduire en
français ? Décidément, c'est bizzard à assimiler.
Un tuto vidéo serait du meilleur effet ;-)

Voilà ce que moi j'ai mis en place :

<?php

$texte = "<html><head></head><body><h1>Un titreH1 </h1><br/>du contenu<h2>Un
titre H2</h2>du contenu<br/><h3>Un titre H3</h3><div align=\"center\">Hello
REGEX</div></body></html>";

echo("Le code d'origine à traiter<br/>");
$origine = htmlentities($texte);
echo ("$origine<br/>");


if (preg_match('@<body>(.+)</body>@U', $texte, $reg1))
{
/* print"$reg1[1]"; */
echo ("LE REGEX FONCTIONNE : LE CONTENU DE BODY EST RECUPERE !<br/>");
}
else
{
echo "<br>Ne Marche pas";
}

echo("Le code de sortie<br/>");
$sortie = htmlentities($reg1[1]);
echo ("$sortie<br/>");

?>
Olivier Miakinen
2008-02-05 00:13:05 UTC
Permalink
Merci de ta réponse, si tu as le temps, tu peux essayer de me la traduire en
français ?
:-D

Je n'avais pas l'impression de causer en swahili.
Décidément, c'est bizarre à assimiler.
Un tuto vidéo serait du meilleur effet ;-)
Volontiers, si tu me payes la caméra, l'ordinateur assez puissant, et
bien sûr le logiciel de capture et de montage.
Bon, eh bien je vais essayer de traduire en français ce que tu as fait.
<?php
$texte = "<html><head></head><body><h1>Un titreH1 </h1><br/>du contenu<h2>Un
titre H2</h2>du contenu<br/><h3>Un titre H3</h3><div align=\"center\">Hello
REGEX</div></body></html>";
Ok. Ça manque un peu d'espaces et de sauts de ligne, mais c'est une
jolie soupe de balises. Et la plupart des navigateurs devraient savoir
en faire quelque chose.
echo("Le code d'origine à traiter<br/>");
$origine = htmlentities($texte);
echo ("$origine<br/>");
Ok.
1) Tu préfères utiliser preg_match() au lieu de preg_replace(). C'est
ton droit le plus strict.

2) Tu as utilisé "@" là où j'avais utilisé "|". Là encore, c'est comme
tu veux. Il faut juste éviter (entre autres) le caractère "/" qui est
déjà utilisé dans la regexp.

3) Dans ta question, tu avais dit que tu voulais récupérer le <body> et
le </body> en plus du contenu, mais la position des parenthèses fait que
tu ne récupèreras que le contenu dans $reg1[1]. Cela dit, $reg1[0] doit
contenir l'ensemble.

4) L'option U n'est pas utile puisque, jusqu'à preuve du contraire, il y
a un seul body dans un code html.

5) En revanche, l'option s sera indispensable le jour où le code HTML ne
sera pas tout entier sur une seule ligne (ce qui est quand même un cas
assez fréquent).
{
/* print"$reg1[1]"; */
echo ("LE REGEX FONCTIONNE : LE CONTENU DE BODY EST RECUPERE !<br/>");
Oui. D'après la doc tu dois avoir le contenu de BODY dans $reg1[1], et
le contenu plus les deux balises dans $reg1[0].
}
else
{
echo "<br>Ne Marche pas";
}
echo("Le code de sortie<br/>");
$sortie = htmlentities($reg1[1]);
echo ("$sortie<br/>");
?>
Euh... quelle est la question, au fait ? Il ne te plaît pas, ton code ?

À tout hasard voici quelques liens utiles :
http://fr2.php.net/manual/fr/reference.pcre.pattern.modifiers.php
http://fr2.php.net/manual/fr/reference.pcre.pattern.syntax.php
http://fr2.php.net/manual/fr/function.preg-match.php
http://fr2.php.net/manual/fr/function.preg-replace.php
SAM
2008-02-05 23:43:02 UTC
Permalink
Salutatous,

Je m'immisce pour parler de ma marotte du moment :
les fonctions DOM de PHP
Post by Olivier Miakinen
Post by SuperG2
<?php
$texte = "<html><head></head><body><h1>Un titreH1 </h1><br/>du contenu<h2>Un
titre H2</h2>du contenu<br/><h3>Un titre H3</h3><div align=\"center\">Hello
REGEX</div></body></html>";
Ok. Ça manque un peu d'espaces et de sauts de ligne, mais c'est une
jolie soupe de balises. Et la plupart des navigateurs devraient savoir
en faire quelque chose.
Pour une soupe c'est une soupe !
J'ai tenté tant bien que mal d'essayer d'extraire le contenu du body du
$texte via ce que je comprends des fonctions DOM.

Je soumets donc à votre tès grande sagacité le code suivant
(qui n'a sans doute guère d'intérêt dans ce petit contexte mais qui
pourrait être extrêmement simplifié si la finalité est de construire une
nouvelle page "rappropriée")


Voilà (insertion dans un div du contenu du body de $texte) :

<?php
$texte = "<html><head></head><body><h1 ID='TRUC'
STYLE='text-align:center'>Un titre H1</h1><br/>du contenu<h2>Un titre
H2</h2>du contenu<br/><h3>Un titre H3</h3><div align=\"center\">Hello
REGEX</div></body></html>";
$sortie = "Le code d'origine à traiter" ;

function printElement( $elemt ) {
$tag = $elemt->nodeName;
$attr = '';
$attr = $elemt->hasAttribute('id')?
" id='".$elemt->getAttribute('id')."'" : "";
$attr .= $elemt->hasAttribute('name')?
" name='".$elemt->getAttribute('name')."'" : "";
$attr .= $elemt->hasAttribute('class')?
" class='".$elemt->getAttribute('class')."'" : "";
$attr .= $elemt->hasAttribute('style')?
" style='".$elemt->getAttribute('style')."'" : "";
$txt = '';
if ($elemt->hasChildNodes()) {
foreach ($elemt->childNodes as $nodling) {
$txt .= $nodling->nodeValue;
}
}
$tag2 =(strtolower($tag) != 'br' && strtolower($tag) != 'hr')?
" </$tag>" : "";
return "<$tag$attr>\n$txt\n$tag2\n";
}

$doc = new DOMDocument();
$doc->loadHTML($texte);
$origine = $doc->getElementsByTagName("body")->item(0);
$origine = $origine->getElementsByTagName("*");

print"<h1 style='color:red'>$sortie</h1>\n";
print "<div style='border:1px solid;paddind:10px;background:#ffc'>\n";

if( $lg = $origine->length )
for ( $i = 0; $i < $lg; $i++ ) {
$item = $origine->item($i);
echo printElement( $item);
}

print "</div><!-- fin d'insertion -->";
?>


Et où l'on voit bien ce que donne une soupe de balises quand on tente de
l'analyser :
le bout de texte 'du contenu'
qui est en dehors de tout conteneur (tag ?) est oublié au passage ...

Maintenant, il est possible que je me sois gourationné et que plus
simple se pourrait ?
--
sm
Mickael Wolff
2008-02-06 07:34:03 UTC
Permalink
Post by SAM
Et où l'on voit bien ce que donne une soupe de balises quand on tente de
le bout de texte 'du contenu'
qui est en dehors de tout conteneur (tag ?) est oublié au passage ...
$origine = $origine->getElementsByTagName("*");
Les textnodes de body ne sont pas récupérés lors de cette manœuvre,
puisque tu ne prend que ces éléments fils.
Post by SAM
Maintenant, il est possible que je me sois gourationné et que plus
simple se pourrait ?
Plus simple pourrait... Mais que veux tu faire ? Hormis faire mumuse :)
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
SAM
2008-02-06 10:28:12 UTC
Permalink
Post by Mickael Wolff
Post by SAM
Et où l'on voit bien ce que donne une soupe de balises quand on tente de
le bout de texte 'du contenu'
qui est en dehors de tout conteneur (tag ?) est oublié au passage ...
$origine = $origine->getElementsByTagName("*");
Les textnodes de body ne sont pas récupérés lors de cette manœuvre,
puisque tu ne prend que ces éléments fils.
Bon, et comment faire ?
Depuis, j'avais vu ce manque, et cette fois je récupère *tout* le texte
mais vraiment *tout* et y compris celui des autres balises et en un seul
jet.
:-(
Post by Mickael Wolff
Post by SAM
Maintenant, il est possible que je me sois gourationné et que plus
simple se pourrait ?
Plus simple pourrait... Mais que veux tu faire ? Hormis faire mumuse :)
Comme +/- dit en intro de mon intervention,
je découvre les fonctions DOM de php.
(c'est d'ailleurs ma seule motivation à venir sur ce ng et j'ouvre un
nouveau fil à ce sujet)

Disons qu'ici je tentais d'attaquer la question par un autre angle que
les expressions régulières.

A ce que je comprends, l'idée est de réceptionner une page (sans doute
construite par une espèce de formulaire) d'en extraire que le contenu
("contenu du body") pour l'intégrer dans une partie d'une autre et à mon
idée c'est vraiment un travail à faire traiter via le DOM.

Avec un peu de chance le résultat pourra être un peu + standard ?

L'exemple donné ne passant pas au validateur :
" You have used character data somewhere it is not permitted to appear.
* putting text directly in the body of the document without wrapping
it in a container element (such as a <p>aragraph</p>)"
--
sm
Mickael Wolff
2008-02-06 12:48:39 UTC
Permalink
Post by SAM
Bon, et comment faire ?
Depuis, j'avais vu ce manque, et cette fois je récupère *tout* le texte
mais vraiment *tout* et y compris celui des autres balises et en un seul
jet.
:-(
Si tu consultes l'attribut textContent de l'élément, tu récupère
effectivement tout le texte contenu dans le nœud élément et ces enfants.
Post by SAM
A ce que je comprends, l'idée est de réceptionner une page (sans doute
construite par une espèce de formulaire) d'en extraire que le contenu
("contenu du body") pour l'intégrer dans une partie d'une autre et à mon
idée c'est vraiment un travail à faire traiter via le DOM.
Avec un peu de chance le résultat pourra être un peu + standard ?
" You have used character data somewhere it is not permitted to appear.
* putting text directly in the body of the document without wrapping
it in a container element (such as a <p>aragraph</p>)"
Oui, parce qu'il n'est pas valide. Aucune DTD n'est définie pour
commencer, ce que DOMDocument n'aime pas tellement. Mais normalement tu
peux faire en sorte que le processeur DOM soit moins tatillon. Au pire,
tu peux piéger les exceptions lancées par l'analyse et les ignorer. Au pire.

Pour récupérer le contenu texte du body, tu pourrais utiliser ça :

$bodyElmt = $dom->getElementsByTagName('body')->item(0) ;
$txtNodes = array() ;
if($bodyElmt->hasChildNodes())
foreach($body->childNodes as $baby)
if($baby->nodeType == DOMDocument::XML_TEXT_NODE)
$txtNodes[] = $baby ;

Sinon il y a une autre solution
<news:479ff308$0$12361$***@news.free.fr> que j'ai déjà détaillé.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
SAM
2008-02-06 20:49:02 UTC
Permalink
Post by Mickael Wolff
Post by SAM
cette fois je récupère *tout* le texte
et y compris celui des autres balises et en un seul jet.
Si tu consultes l'attribut textContent de l'élément, tu récupère
effectivement tout le texte contenu dans le nœud élément et ces enfants.
J'ai fait :

$doc = new DOMDocument();
if (!$dom = @$doc->loadHTML($texte)) {
echo "Erreur lors de l'analyse du document\n";
exit;
}
$origine = $doc->getElementsByTagName("body")->item(0);
if ($origine->hasChildNodes()) {
$txt = '';
foreach ($origine->childNodes as $nodling) {
$txt .= ' | '.$nodling->nodeValue;
}
echo $txt;
}
else echo 'Y a personne !';
Post by Mickael Wolff
Oui, parce qu'il n'est pas valide. Aucune DTD n'est définie pour
commencer, ce que DOMDocument n'aime pas tellement.
Heu, je crois bien avoir fait passer l'exemple avec une DTD,
et p'têtre même avec un meta charset
Quoi ? Comment ? tu m'as copié ? :-)
Post by Mickael Wolff
$bodyElmt = $dom->getElementsByTagName('body')->item(0) ;
$txtNodes = array() ;
if($bodyElmt->hasChildNodes())
foreach($body->childNodes as $baby)
if($baby->nodeType == DOMDocument::XML_TEXT_NODE)
Ha Ha ! voilà qui me manquait.
Post by Mickael Wolff
$txtNodes[] = $baby ;
Sinon il y a une autre solution
Je vois que tu y sites ma source d'info et d'apprentissage.
<http://fr.php.net/manual/fr/ref.dom.php>
Ou bien je ne sais pas m'en servir, ou bien ne sais pas la lire,
mais je trouve malheureux qu'on ne nous dise pas d'entrée ce que sont :
DOMElement
DOMAttr
DOMText
DOMCharacterData
DOMEntityReference
DOMEntity
DOMProcessingInstruction
DOMComment
DOMDocument
DOMDocumentType
DOMDocumentFragment
DOMNotation

à moins que ça ne fasse appel à des notions innées ?


Je suis encore une fois effaré de la complexité du PHP, rien que pour ce
DOM on a je ne sais combien d'instructions chatouilleuses et ne suis pas
parvenu à y trouver un truc simple pour l'équivalent du innerHTML du
JavaScript par exemple.

'textContent', auquel tu fais allusion ci-haut, je le trouve au 10ieme
scroll d'écran de 'ref.dom.php'
Bon, ce serait une propriété de DOMNode
Oui? et alors ? déjà que DOMNode n'est pas dans mon petit listing
ci-dessus, comment se sert-on de ces propriétés ?

Voyons voir :
echo $doc->getElementsByTagName("body")->item(0)->textContent;
Non, ce n'est encore pas innerHTML



Ça va pas être coton d'intégrer tout ça.

Tu codes avec la doc à côté ou bien le fais-tu tout de mémoire ?
--
sm
Mickael Wolff
2008-02-07 00:11:28 UTC
Permalink
Post by SAM
$doc = new DOMDocument();
echo "Erreur lors de l'analyse du document\n";
exit;
}
Attention ! loadHTML ne renvoie pas la même valeur si il est utilisé
comme méthode de l'objet ou comme fonction statique
<http://fr2.php.net/manual/fr/function.dom-domdocument-load.php> :

if (! @$doc->loadHTML($texte)) {
echo "Erreur lors de l'analyse du document\n";
exit;
}
Post by SAM
Quoi ? Comment ? tu m'as copié ? :-)
Bah, je complète :p
Post by SAM
Je vois que tu y sites ma source d'info et d'apprentissage.
<http://fr.php.net/manual/fr/ref.dom.php>
Ou bien je ne sais pas m'en servir, ou bien ne sais pas la lire,
Comme dit en préambule de la documentation de l'implémentation de
l'API DOM, ils supposent que tu connaissent déjà les principes, ou que
tu ais lu la documentation normalisant DOM
<http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html>
Post by SAM
Je suis encore une fois effaré de la complexité du PHP, rien que pour ce
DOM on a je ne sais combien d'instructions chatouilleuses et ne suis pas
parvenu à y trouver un truc simple pour l'équivalent du innerHTML du
JavaScript par exemple.
Il n'y en a pas, et heureusement. innerHTML c'est quand même la porte
ouverte à des choses bien gorets, non ? Et puis c'est pas standard. Et
puis c'est la même API en javascript.
Post by SAM
'textContent', auquel tu fais allusion ci-haut, je le trouve au 10ieme
scroll d'écran de 'ref.dom.php'
Bon, ce serait une propriété de DOMNode
Oui? et alors ? déjà que DOMNode n'est pas dans mon petit listing
ci-dessus, comment se sert-on de ces propriétés ?
Le problème de la documentation PHP est qu'elle défini dans l'ordre
alphabétique les classes. Ce qui pour l'apprentissage n'est pas du
meilleurs goût. Regardes la documentation du W3C qui est un peu plus «
didactique ».
Post by SAM
echo $doc->getElementsByTagName("body")->item(0)->textContent;
Non, ce n'est encore pas innerHTML
Et tu n'en auras pas. Enfin, tu peux bricoler quelque chose, j'ai déjà
fait, mais c'est un peu dégueux (créer un DOMDocumentFragment à partir
de la chaine que tu veux intégrer, faire adopter les nœuds de ce
fragment par le DOM de destination, et les placer dans l'arborescence).
Post by SAM
Ça va pas être coton d'intégrer tout ça.
Tu n'utilisais jamais ça en javascript ?
Post by SAM
Tu codes avec la doc à côté ou bien le fais-tu tout de mémoire ?
l'API est bien faite, au bout d'un moment ça rentre. Mais je garde
toujours une feuille à côté de moi avec ce que j'oublie systématiquement ;)
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
SAM
2008-02-07 22:15:20 UTC
Permalink
Bon, finalement, si on continue ici, je n'ouvre pas de fil.
Post by Mickael Wolff
Post by SAM
$doc = new DOMDocument();
echo "Erreur lors de l'analyse du document\n";
exit;
}
Attention ! loadHTML ne renvoie pas la même valeur si il est utilisé
comme méthode de l'objet ou comme fonction statique
Heu ... ils parlent là de load() et non de loadHTML()
(me reste à tester leurs exemples, car, bien sûr, je n'ai rien compris)
Oui, mais je suppose que ma variable $dom ne gène pas ?
Disons que ce soit un réflexe des fois que la condition soit à
réutiliser plus loin (bien qu'ici ... certes avec 'exit' ...)
Post by Mickael Wolff
Post by SAM
<http://fr.php.net/manual/fr/ref.dom.php>
Ou bien je ne sais pas m'en servir, ou bien ne sais pas la lire,
Comme dit en préambule de la documentation de l'implémentation de
l'API DOM, ils supposent que tu connaissent déjà les principes, ou que
tu ais lu la documentation normalisant DOM
<http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html>
Faut juste maintenant la trouver en frenchie ;-)
<http://www.yoyodesign.org/doc/w3c/dom2-core/core.html>
m'a l'air moins complet.
Post by Mickael Wolff
Post by SAM
trouver un truc simple pour l'équivalent du innerHTML du
JavaScript par exemple.
Il n'y en a pas, et heureusement. innerHTML c'est quand même la porte
ouverte à des choses bien gorets, non ? Et puis c'est pas standard.
Oui, certes, n'empêche c'est quand même bien pratique (si on ne s'en
sert pas n'importe comment).
Post by Mickael Wolff
Post by SAM
Ça va pas être coton d'intégrer tout ça.
Tu n'utilisais jamais ça en javascript ?
En JS c'est comparativement essstrémement simple,
on n'a pas de notions hyper chatouilleuses comme en PHP.
Au hasard :
Entity = nom de l'entité
EntityReference = nom de l'entité appelée
si ce n'est pas se compliquer la vie ?
(encore une fois j'ai rien compris, je vais relire ... peut-être)
(j'ai comme l'impression que c'est exactement la même chose, une fois
appelé, une fois introduit. Si c'est le cas pourquoi faire une différence ?)
--
sm
Mickaël Wolff
2008-02-14 19:13:50 UTC
Permalink
Bonjour,

Désolé pour le temps de réponse, j'ai été loin de mon ordinateur
quelques jours.
Post by SAM
Bon, finalement, si on continue ici, je n'ouvre pas de fil.
Ben vi, autant utiliser ce qui existe.
Post by SAM
Heu ... ils parlent là de load() et non de loadHTML()
(me reste à tester leurs exemples, car, bien sûr, je n'ai rien compris)
Oui, bon, certes... j'avais lu rapidement. Tu conviendras que faire la
distinction d'usage entre les deux n'est pas du meilleurs goût.
Post by SAM
Oui, mais je suppose que ma variable $dom ne gène pas ?
C'était au cas où tu essayais d'en faire quelque chose plus tard !
Post by SAM
<http://www.yoyodesign.org/doc/w3c/dom2-core/core.html>
m'a l'air moins complet.
Oui, la référence que je t'ai donné concerne DOM3, et celle que tu
utilises concerne DOM2.
Post by SAM
En JS c'est comparativement essstrémement simple,
on n'a pas de notions hyper chatouilleuses comme en PHP.
Entity = nom de l'entité
EntityReference = nom de l'entité appelée
si ce n'est pas se compliquer la vie ?
Parce que ce n'est pas la même chose ? Entity est la classe
représentant l'entité telle que définit dans la DTD. Alors que
EntityReference définit une occurrence de l'entité dans le document.

Si tu regardes bien, EntityReference étend Node sans plus de
précision, alors que EntityReference étend Node en ajoutant des attributs.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
SAM
2008-02-15 08:02:19 UTC
Permalink
Post by Mickaël Wolff
Bonjour,
Désolé pour le temps de réponse, j'ai été loin de mon ordinateur
quelques jours.
Il n'y a pas de lézard.
J'ai aussi bien d'autres occupations.
Post by Mickaël Wolff
Post by SAM
Heu ... ils parlent là de load() et non de loadHTML()
(me reste à tester leurs exemples, car, bien sûr, je n'ai rien compris)
Oui, bon, certes... j'avais lu rapidement. Tu conviendras que faire la
distinction d'usage entre les deux n'est pas du meilleurs goût.
... je n'y connais rien en php et tout ce qu'on m'y propose (en doublon
et apparemment triplon quadruplon) m'étonne toujours ... alors ... why
not ? pendant qu'on y est à délayer.
Post by Mickaël Wolff
Post by SAM
Entity = nom de l'entité
EntityReference = nom de l'entité appelée
si ce n'est pas se compliquer la vie ?
Parce que ce n'est pas la même chose ? Entity est la classe
représentant l'entité telle que définit dans la DTD. Alors que
EntityReference définit une occurrence de l'entité dans le document.
C'est bien ce que je dis : rien fait que pour m'embrouiller.
J'archive les liens et les posts, je m'y remets bientôt et reviendrai
poser mes sottes questions.
--
sm
Bruno Desthuilliers
2008-02-05 10:18:24 UTC
Permalink
Olivier Miakinen a écrit :
(snip)
Post by Olivier Miakinen
En toute généralité, pour parser du (X)HTML, il faut plus que des
regexp. Mais si c'est juste pour récupérer ce qui va de <body> à
$body = preg_replace('|.*(<body>.*</body>).*|s', '$1', $document);
À adapter si jamais tu risques de rencontrer des <BODY> ou des < body >
Ou encore:
<body truc="bidule" machin="chouette">
SuperG2
2008-02-06 07:30:37 UTC
Permalink
Arf oui, c'est vrai !! Est ce que ma solution prend en compte les body
'trafiqués' :p

Bienvu Bruno ;-)

Hmmm donc je dois trouver le caractère ou le jeu de caracteres qui va me
permettre de dire '<body' .(TOUT). '>'

Ok :p

<?php

$texte = "<html><head></head><body><h1>Un titreH1 </h1><br/>du contenu<h2>Un
titre H2</h2>du contenu<br/><h3>Un titre H3</h3><div align=\"center\">Hello
REGEX</div></body></html>";

echo("Le code d'origine à traiter<br/>");
$origine = htmlentities($texte);
echo ("$origine<br/>");


if (preg_match('@<body>(.+)</body>@U', $texte, $reg1))
{
/* print"$reg1[1]"; */
echo ("LE REGEX FONCTIONNE : LE CONTENU DE BODY EST RECUPERE !<br/>");
}
else
{
echo "<br>Ne Marche pas";
}

echo("Le code de sortie<br/>");
$sortie = htmlentities($reg1[1]);
echo ("$sortie<br/>");

?>
Post by Bruno Desthuilliers
(snip)
Post by Olivier Miakinen
En toute généralité, pour parser du (X)HTML, il faut plus que des
regexp. Mais si c'est juste pour récupérer ce qui va de <body> à
$body = preg_replace('|.*(<body>.*</body>).*|s', '$1', $document);
À adapter si jamais tu risques de rencontrer des <BODY> ou des < body >
<body truc="bidule" machin="chouette">
Bruno Desthuilliers
2008-02-06 10:28:12 UTC
Permalink
Post by SuperG2
Arf oui, c'est vrai !! Est ce que ma solution prend en compte les body
'trafiqués' :p
Bienvu Bruno ;-)
Hmmm donc je dois trouver le caractère ou le jeu de caracteres qui va me
permettre de dire '<body' .(TOUT). '>'
Ce que tu veux, c'est '<body' suivi de "tout sauf >" 0 à N fois suivi de
'>'

"tout sauf >" s'écrit avec une classe complémentée: [^>]

Donc ça devrait être quelque chose comme:

'<body[^>]*>(.*)</body>'

Avec les flags qui vont bien pour la (non) prise en compte de la casse etc.

(NB : non testé)
Paul
2008-02-06 10:28:12 UTC
Permalink
Post by SuperG2
Bonjour
...
Post by SuperG2
Comment alors pourais je récupérer le body, son contenu et le /body pour
laisser se mourir notre pauvre doctype préconfiguré ainsi que les
données du head
Une idée comme ça : comme les occurences du mot 'body' ne peuvent être
plus de 2, pourquoi ne pas commencer par un explode('body',$texte,-1) et
ainsi récupérer l'en tête et le corps ?
Olivier Miakinen
2008-02-06 14:08:04 UTC
Permalink
Post by Paul
...
Post by SuperG2
Comment alors pourais je récupérer le body, son contenu et le /body pour
laisser se mourir notre pauvre doctype préconfiguré ainsi que les
données du head
Une idée comme ça : comme les occurences du mot 'body' ne peuvent être
plus de 2, pourquoi ne pas commencer par un explode('body',$texte,-1) et
ainsi récupérer l'en tête et le corps ?
Non, ça ne marchera pas. Cf. l'exemple suivant :

<html>
<head>
<title>Essai de récupération du body</title>
</head>
<body>
<h1>Essai de récupération du body</h1>
<p>On veut extraire ce qui est entre body et /body.</p>
</body>
</html>

Et encore pire :

<HTML>
<HEAD>
<TITLE>Essai de récupération du body</TITLE>
</HEAD>
<BODY>
<H1>Essai de récupération du body</H1>
<P>On veut extraire ce qui est entre body et /body.</P>
</BODY>
</HTML>
Paul
2008-02-06 20:49:02 UTC
Permalink
Post by Paul
...
Post by SuperG2
Comment alors pourais je récupérer le body, son contenu et le /body pour
laisser se mourir notre pauvre doctype préconfiguré ainsi que les
données du head
Une idée comme ça : comme les occurences du mot 'body' ne peuvent être
plus de 2, pourquoi ne pas commencer par un explode('body',$texte,-1) et
ainsi récupérer l'en tête et le corps ?
Bien vu, mais explode('body>',$texte,-1) le fera dans tes deux cas.
Olivier Miakinen
2008-02-06 21:20:58 UTC
Permalink
Post by Paul
Post by Paul
Une idée comme ça : comme les occurences du mot 'body' ne peuvent être
plus de 2, pourquoi ne pas commencer par un explode('body',$texte,-1) et
ainsi récupérer l'en tête et le corps ?
Bien vu, mais explode('body>',$texte,-1) le fera dans tes deux cas.
Dans le premier cas oui, mais pas dans le second (avec les balises en
majuscules). Et il ne marchera pas non plus dans le cas suivant, dont je
crois bien qu'il est valide :

<html>
<head>
<title>Essai de récupération du &lt;body></title>
</head>
<body>
<h1>Essai de récupération du &lt;body></h1>
<p>On veut extraire ce qui est entre &lt;body> et &lt;/body>.</p>
</body>
</html>

Au fait, il ne fonctionnera pas non plus pour le code suivant, valide
HTML 4.01 Strict, mais aucune solution à base de regexp ne fonctionnera
ici, contrairement à une solution à base de DOM :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<title>Ceci est le titre, dans le HEAD</title>
<p>Ceci est un paragraphe, dans le BODY.
Paul
2008-02-07 12:23:19 UTC
Permalink
...
Post by Olivier Miakinen
Au fait, il ne fonctionnera pas non plus pour le code suivant, valide
HTML 4.01 Strict, mais aucune solution à base de regexp ne fonctionnera
Voilà une analyse complète. Merci.
SuperG2
2008-02-13 22:42:35 UTC
Permalink
Post by Paul
Post by Olivier Miakinen
Au fait, il ne fonctionnera pas non plus pour le code suivant, valide
HTML 4.01 Strict, mais aucune solution à base de regexp ne fonctionnera
Voilà une analyse complète. Merci.
Ha bah je suis impatient d'exploiter Dom pour récupérer du contenu :)
Ravi d'avoir pu initier la discution :)

Super G2 ohoh Super le DOM :)
Continuer la lecture sur narkive:
Loading...