Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Expression Reguliere] Rechercher Balis es dans fichier HTML

5 réponses
Avatar
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 ;)

Merci à tous, ;)

J.

5 réponses

Avatar
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);

/*
echo "<pre>";
echo "<p style="background-color:cyan;">Source
xml:<br />".htmlentities($data)."</p>";
//echo "<p>val=<br />".htmlentities(print_r($vals,true))."</p>";
//echo "<p>Tag=<br />".htmlentities(print_r($tag,true))."</p>";
echo "</pre>";
*/
$TableauºlisesDansTableau($vals,$tag);

return $Tableau;
}

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

Avatar
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

Avatar
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 ;)

//############################################################

$fp = fopen("test1.php", 'r');
$var="";
while (!feof($fp)) {
$var .= fgets($fp);
}
$balise = eregi("<MA_BALISE>(.*)</MA_BALISE>",$var,$regs);
echo $regs[1];
fclose($fp);

//############################################################

J.

Avatar
Jonathan

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.

Avatar
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 ;)

Merci à tous, ;)

J.


Bonjour,

L'expression régulière pourrait être:
/<MA_BALISE>(.*)</MA_BALISE>/s

Exemple de code (que je place dans le domaine public):

------8<----------8<----------8<----------8<----------
<?php
// définition des balises
$mesBalises = array(
'MA_BALISE',
'UNE_AUTRE_BALISE'
);

// 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";}

array_walk($matches[2],'affichage');
?>
------8<----------8<----------8<----------8<----------


La sortie donne:

$ php toto.php
123 Mon texte
321 -----
456= Autre texte 654 -----
$


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