[Expression Reguliere] Rechercher Balis es dans fichier HTML
5 réponses
Jonathan
Salut,
Voici un petit pb qui me rend complètement fou.... surement parce que je
maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur.
Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE>
blablabla...
</MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher
dans ma page.
Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit
d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je
me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas
parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la
piste, ce serait vraiment super cool ;)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Batman
J'ai mis en HS car je vais pas répondre à ta question, mais proposer une autre solution (qui n'est peut être pas faisable dans ton cas)
<MA_BALISE> blablabla... </MA_BALISE> [...] mais c'est quand il s'agit d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je me deviens fou.
Pourquoi ne pas le traiter comme du xml ? (body étant le noeud de base)
function EnumBalise($source) {
$xml_parser = xml_parser_create();
if (!($fp = fopen($source, "r"))) { die("could not open XML input"); } else { $data = fread($fp, filesize($source)); fclose($fp); } xml_parse_into_struct($xml_parser, $data, $vals, $tag); $err=xml_get_error_code($xml_parser); $MsgErr=$_SERVER["SCRIPT_FILENAME"].": Erreur PHP/xml N°$err=".xml_error_string($err); if ($MsgErr!=0) { syslog(LOG_ERR,$MsgErr); } xml_parser_free($xml_parser);
function BalisesDansTableau ($val1,$tab1) { settype($MesTags,"array"); foreach ($val1 as $indice=>$LesBalises) { //echo "<br />$indice=<span style="color:blue ">".htmlentities(print_r($LesBalises,true))."</span>"; $UneBalise=$LesBalises["tag"];
switch ($UneBalise){ case "XML": // dans ton cas mettre BODY break; case "PRIVE": break; default: // ajouter le test sur MA_BALISE if (isset($LesBalises["value"])) { /* cas ou il y a des balise dans $LesBalises["value"] 6=Array ( [tag] => MONTEXTE [type] => open [level] => 2 [value] => Ceci est mon Texte ) 8=Array ( [tag] => MONTEXTE [type] => close [level] => 2 ) */ @$MesTags["$UneBalise"].=" ".$LesBalises["value"]; //echo "n<br />".$UneBalise."=<span style="color:blue;">" $MesTags[$UneBalise]."</span>"; } break; } } return $MesTags; }
-- Les fautes d'orthographes sont ma signature :-) pour me répondre en BAL (mode antispam) http://batman.dyndns.org/V2/Mail/?src=news.free
J'ai mis en HS car je vais pas répondre à ta question, mais proposer une
autre solution (qui n'est peut être pas faisable dans ton cas)
<MA_BALISE>
blablabla...
</MA_BALISE>
[...] mais c'est quand il s'agit
d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je
me deviens fou.
Pourquoi ne pas le traiter comme du xml ? (body étant le noeud de base)
function EnumBalise($source) {
$xml_parser = xml_parser_create();
if (!($fp = fopen($source, "r"))) {
die("could not open XML input");
} else {
$data = fread($fp, filesize($source));
fclose($fp);
}
xml_parse_into_struct($xml_parser, $data, $vals, $tag);
$err=xml_get_error_code($xml_parser);
$MsgErr=$_SERVER["SCRIPT_FILENAME"].": Erreur PHP/xml
N°$err=".xml_error_string($err);
if ($MsgErr!=0) { syslog(LOG_ERR,$MsgErr); }
xml_parser_free($xml_parser);
function BalisesDansTableau ($val1,$tab1) {
settype($MesTags,"array");
foreach ($val1 as $indice=>$LesBalises) {
//echo "<br />$indice=<span style="color:blue
">".htmlentities(print_r($LesBalises,true))."</span>";
$UneBalise=$LesBalises["tag"];
switch ($UneBalise){
case "XML": // dans ton cas mettre BODY
break;
case "PRIVE":
break;
default: // ajouter le test sur MA_BALISE
if (isset($LesBalises["value"])) {
/*
cas ou il y a des balise dans $LesBalises["value"]
6=Array ( [tag] => MONTEXTE [type] => open [level] => 2 [value] => Ceci
est mon Texte )
8=Array ( [tag] => MONTEXTE [type] => close [level] => 2 )
*/
@$MesTags["$UneBalise"].=" ".$LesBalises["value"];
//echo "n<br />".$UneBalise."=<span style="color:blue;">"
$MesTags[$UneBalise]."</span>";
}
break;
}
}
return $MesTags;
}
--
Les fautes d'orthographes sont ma signature :-)
pour me répondre en BAL (mode antispam)
http://batman.dyndns.org/V2/Mail/?src=news.free
J'ai mis en HS car je vais pas répondre à ta question, mais proposer une autre solution (qui n'est peut être pas faisable dans ton cas)
<MA_BALISE> blablabla... </MA_BALISE> [...] mais c'est quand il s'agit d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je me deviens fou.
Pourquoi ne pas le traiter comme du xml ? (body étant le noeud de base)
function EnumBalise($source) {
$xml_parser = xml_parser_create();
if (!($fp = fopen($source, "r"))) { die("could not open XML input"); } else { $data = fread($fp, filesize($source)); fclose($fp); } xml_parse_into_struct($xml_parser, $data, $vals, $tag); $err=xml_get_error_code($xml_parser); $MsgErr=$_SERVER["SCRIPT_FILENAME"].": Erreur PHP/xml N°$err=".xml_error_string($err); if ($MsgErr!=0) { syslog(LOG_ERR,$MsgErr); } xml_parser_free($xml_parser);
function BalisesDansTableau ($val1,$tab1) { settype($MesTags,"array"); foreach ($val1 as $indice=>$LesBalises) { //echo "<br />$indice=<span style="color:blue ">".htmlentities(print_r($LesBalises,true))."</span>"; $UneBalise=$LesBalises["tag"];
switch ($UneBalise){ case "XML": // dans ton cas mettre BODY break; case "PRIVE": break; default: // ajouter le test sur MA_BALISE if (isset($LesBalises["value"])) { /* cas ou il y a des balise dans $LesBalises["value"] 6=Array ( [tag] => MONTEXTE [type] => open [level] => 2 [value] => Ceci est mon Texte ) 8=Array ( [tag] => MONTEXTE [type] => close [level] => 2 ) */ @$MesTags["$UneBalise"].=" ".$LesBalises["value"]; //echo "n<br />".$UneBalise."=<span style="color:blue;">" $MesTags[$UneBalise]."</span>"; } break; } } return $MesTags; }
-- Les fautes d'orthographes sont ma signature :-) pour me répondre en BAL (mode antispam) http://batman.dyndns.org/V2/Mail/?src=news.free
Paul Delannoy
Jonathan a écrit:
Salut,
Voici un petit pb qui me rend complètement fou.... surement parce que je maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur. Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE> blablabla... </MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher dans ma page. Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la piste, ce serait vraiment super cool ;)
Encore une fois, pas besoin d'un marteau pilon pour une telle mouche ;-) Juste ceci : charger le contenu du fichier dans une variable ($c_fic par exemple) puis tant que $c_fic contient "<MA_BALISE>" à une position $deb, extraire la sous chaine commencant à $deb+12 se terminant à la position de </MA_BALISE> -1 (si elle n'existe pas, erreur : fichier mal lu ou mal bâti)
Tu peux aussi te servir de ça, qui est la même idée appliquée à une mabile (tag) qcq (trouvé dans php.net à la rubrique strpos) 03-Dec-2004 06:28 here a little function for tag parsing function parsing($tag,$string) { $start=strpos($string,"<" . $tag . ">" ); $start=$start + strlen("<" . $tag . ">"); $end=(strpos($string, "</" . $tag . ">")); $num= ($end - $start); $valore=substr($string,$start,$num); return $valore; } J'eqça
Jonathan a écrit:
Salut,
Voici un petit pb qui me rend complètement fou.... surement parce que je
maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur.
Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE>
blablabla...
</MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher
dans ma page.
Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit
d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je
me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas
parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la
piste, ce serait vraiment super cool ;)
Encore une fois, pas besoin d'un marteau pilon pour une telle mouche ;-)
Juste ceci :
charger le contenu du fichier dans une variable ($c_fic par exemple)
puis tant que $c_fic contient "<MA_BALISE>" à une position $deb,
extraire la sous chaine commencant à $deb+12 se terminant à la position
de </MA_BALISE> -1 (si elle n'existe pas, erreur : fichier mal lu ou mal
bâti)
Tu peux aussi te servir de ça, qui est la même idée appliquée à une
mabile (tag) qcq (trouvé dans php.net à la rubrique strpos)
03-Dec-2004 06:28
here a little function for tag parsing
function parsing($tag,$string) {
$start=strpos($string,"<" . $tag . ">" );
$start=$start + strlen("<" . $tag . ">");
$end=(strpos($string, "</" . $tag . ">"));
$num= ($end - $start);
$valore=substr($string,$start,$num);
return $valore;
}
J'eqça
Voici un petit pb qui me rend complètement fou.... surement parce que je maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur. Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE> blablabla... </MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher dans ma page. Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la piste, ce serait vraiment super cool ;)
Encore une fois, pas besoin d'un marteau pilon pour une telle mouche ;-) Juste ceci : charger le contenu du fichier dans une variable ($c_fic par exemple) puis tant que $c_fic contient "<MA_BALISE>" à une position $deb, extraire la sous chaine commencant à $deb+12 se terminant à la position de </MA_BALISE> -1 (si elle n'existe pas, erreur : fichier mal lu ou mal bâti)
Tu peux aussi te servir de ça, qui est la même idée appliquée à une mabile (tag) qcq (trouvé dans php.net à la rubrique strpos) 03-Dec-2004 06:28 here a little function for tag parsing function parsing($tag,$string) { $start=strpos($string,"<" . $tag . ">" ); $start=$start + strlen("<" . $tag . ">"); $end=(strpos($string, "</" . $tag . ">")); $num= ($end - $start); $valore=substr($string,$start,$num); return $valore; } J'eqça
Jonathan
Salut,
Voici un petit pb qui me rend complètement fou.... surement parce que je maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur. Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE> blablabla... </MA_BALISE>
Bon sinon, j'ai réussi à pondre un petit truc qui tient la route avec eregi(). Ca reste classique, mais ça marche.
D'après vous ça tient la route ? C'est lourd à traiter ? On peut faire mieux juste avec du PHP+expressions régulières ? La façon dont j'écris mon eregi() risque-t-elle de me poser des soucis dans certains cas ? Toutes vos remarques seront les bienvenues ;)
Voici un petit pb qui me rend complètement fou.... surement parce que je
maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur.
Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE>
blablabla...
</MA_BALISE>
Bon sinon, j'ai réussi à pondre un petit truc qui tient la route avec
eregi(). Ca reste classique, mais ça marche.
D'après vous ça tient la route ? C'est lourd à traiter ? On peut faire
mieux juste avec du PHP+expressions régulières ?
La façon dont j'écris mon eregi() risque-t-elle de me poser des soucis
dans certains cas ?
Toutes vos remarques seront les bienvenues ;)
Voici un petit pb qui me rend complètement fou.... surement parce que je maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur. Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE> blablabla... </MA_BALISE>
Bon sinon, j'ai réussi à pondre un petit truc qui tient la route avec eregi(). Ca reste classique, mais ça marche.
D'après vous ça tient la route ? C'est lourd à traiter ? On peut faire mieux juste avec du PHP+expressions régulières ? La façon dont j'écris mon eregi() risque-t-elle de me poser des soucis dans certains cas ? Toutes vos remarques seront les bienvenues ;)
J'ai mis en HS car je vais pas répondre à ta question, mais proposer une autre solution (qui n'est peut être pas faisable dans ton cas)
Pourquoi ne pas le traiter comme du xml ? (body étant le noeud de base)
Je ne maitrise pas encore complètement les notions d'XML. Je suis en train de m'y mettre. Mais ta solution reste très intéressante.
Je pense d'ailleurs que c'est l'évolution logique pour ce genre de travaux. Merci pour test conseils ;)
J.
Antoine
Jonathan wrote:
Salut,
Voici un petit pb qui me rend complètement fou.... surement parce que je maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur. Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE> blablabla... </MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher dans ma page. Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la piste, ce serait vraiment super cool ;)
// passage au format regex: (balise1|balise2|balise3) $mesBalisesRegex = '('.implode('|',$mesBalises).')';
// un bout de texte pour tester. $text = 'Lorem ipsum dolor sit amet <MA_BALISE>123 Mon texte 321=</MA_BALISE> Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet <UNE_AUTRE_BALISE>456= Autre texte 654=</UNE_AUTRE_BALISE> Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet';
// on analyse le texte $found = preg_match_all('/<'.$mesBalisesRegex.'>(.*)</1>/s', $text, $matches);
function affichage($data) { echo $data."n-----n";}
Une fois la variable $mesBalisesRegex insérée on obtiens l'expression régulière:
/<(MA_BALISE|UNE_AUTRE_BALISE)>(.*)</1>/s
() selectionne le texte .* n'importe quel caractère plusieurs fois 1 rappel le premier texte selectionné s à la fin signifie que le . peut aussi être un retour à la ligne
$matches[0] contient le texte qui correspond à l'expression. $matches[1] la première sélection effectuée avec () (dans notre cas c'est le nom de la balise. $matches[2] la seconde sélection, donc le texte à afficher.
Un excellent outil (sous Windows) pour s'entrainer / débugger des regex: http://www.weitz.de/regex-coach/
cheers,
-- Antoine http://fr.wikipedia.org/ Outlook Express ? Lisez au moins: http://usenetfr.free.fr/faqoe.htm
Jonathan wrote:
Salut,
Voici un petit pb qui me rend complètement fou.... surement parce que je
maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur.
Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE>
blablabla...
</MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher
dans ma page.
Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit
d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je
me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas
parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la
piste, ce serait vraiment super cool ;)
// passage au format regex: (balise1|balise2|balise3)
$mesBalisesRegex = '('.implode('|',$mesBalises).')';
// un bout de texte pour tester.
$text = 'Lorem ipsum dolor sit amet
<MA_BALISE>123 Mon texte
321=</MA_BALISE>
Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet
<UNE_AUTRE_BALISE>456= Autre texte 654=</UNE_AUTRE_BALISE>
Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet';
// on analyse le texte
$found = preg_match_all('/<'.$mesBalisesRegex.'>(.*)</1>/s',
$text, $matches);
function affichage($data) { echo $data."n-----n";}
Une fois la variable $mesBalisesRegex insérée on obtiens l'expression
régulière:
/<(MA_BALISE|UNE_AUTRE_BALISE)>(.*)</1>/s
() selectionne le texte
.* n'importe quel caractère plusieurs fois
1 rappel le premier texte selectionné
s à la fin signifie que le . peut aussi être un retour à la ligne
$matches[0] contient le texte qui correspond à l'expression.
$matches[1] la première sélection effectuée avec () (dans notre cas
c'est le nom de la balise.
$matches[2] la seconde sélection, donc le texte à afficher.
Un excellent outil (sous Windows) pour s'entrainer / débugger des regex:
http://www.weitz.de/regex-coach/
cheers,
--
Antoine
http://fr.wikipedia.org/
Outlook Express ? Lisez au moins: http://usenetfr.free.fr/faqoe.htm
Voici un petit pb qui me rend complètement fou.... surement parce que je maitrise mal les expressions régulières !
J'ai un fichier HTML avec des balises spécifiques à l'intérieur. Je veux afficher dans une page PHP ce qu'il y a entre :
<MA_BALISE> blablabla... </MA_BALISE>
Bref, je veux parser le fichier et extraire "blablabla" pour l'afficher dans ma page. Pour le lire ligne par ligne, pas de pb, mais c'est quand il s'agit d'extraire les lignes comprises entre <MA_BALISE> et </MA_BALISE> que je me deviens fou.
Je suis parti sur les piste de eregi() mais je ne maitrise pas parfaitement cet art.
Si un expert dans les regexp passent par là et peut me mettre sur la piste, ce serait vraiment super cool ;)
// passage au format regex: (balise1|balise2|balise3) $mesBalisesRegex = '('.implode('|',$mesBalises).')';
// un bout de texte pour tester. $text = 'Lorem ipsum dolor sit amet <MA_BALISE>123 Mon texte 321=</MA_BALISE> Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet <UNE_AUTRE_BALISE>456= Autre texte 654=</UNE_AUTRE_BALISE> Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet';
// on analyse le texte $found = preg_match_all('/<'.$mesBalisesRegex.'>(.*)</1>/s', $text, $matches);
function affichage($data) { echo $data."n-----n";}
Une fois la variable $mesBalisesRegex insérée on obtiens l'expression régulière:
/<(MA_BALISE|UNE_AUTRE_BALISE)>(.*)</1>/s
() selectionne le texte .* n'importe quel caractère plusieurs fois 1 rappel le premier texte selectionné s à la fin signifie que le . peut aussi être un retour à la ligne
$matches[0] contient le texte qui correspond à l'expression. $matches[1] la première sélection effectuée avec () (dans notre cas c'est le nom de la balise. $matches[2] la seconde sélection, donc le texte à afficher.
Un excellent outil (sous Windows) pour s'entrainer / débugger des regex: http://www.weitz.de/regex-coach/
cheers,
-- Antoine http://fr.wikipedia.org/ Outlook Express ? Lisez au moins: http://usenetfr.free.fr/faqoe.htm