Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1490 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  expressions régulières et balises HTML

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

expressions régulières et balises HTML

n°445330
grohark
Posté le 01-07-2003 à 16:23:54  profilanswer
 

slt,
n'ayant aucunes connaissances en expressions régulères, j'ai besoin de vous !!!
je souhaiterai extraire d'un fichier HTML, certaines données contenues entre certaines balises.
par exemple <b>toto hoho</b> je souhaiterai extraire "totot hoho".
et un peu plus compliqué si il y a plusieurs balises que se suivent : <font color=black><b>toto hoho</b></font>.
 
merci d'avance

mood
Publicité
Posté le 01-07-2003 à 16:23:54  profilanswer
 

n°445786
FlorentP
Posté le 01-07-2003 à 23:41:55  profilanswer
 

les balises autour sont fixe ou non ?
si oui, look : http://forum.hardware.fr/forum2.ph [...] 30#t445738

n°445915
grohark
Posté le 02-07-2003 à 09:01:33  profilanswer
 

les balises sont toujours pareilles pour un type de texte, par exemple le type titre sera tjrs entouré par les mêmes balises, le type contenu tjrs par les mêmes balises (mais différentes de titre).

n°446008
grohark
Posté le 02-07-2003 à 10:25:15  profilanswer
 

voilà le code que j'ai fait :
 
$session = fopen ("source.tmp", "r" );
$contenu = fread ($session, filesize ("source.tmp" ));
$text = preg_replace("/<span class=\"txtbld\">(.+?)</span>/si","$1",$contenu);
echo"$text";
 
et ça met comme erreur :  
Warning: Unknown modifier 'p'
 
à la ligne : $text = preg_replace("/<span class=\"txtbld\">(.+?)</span>/si","$1",$contenu);
 
aidez moi !! ça m'enerve !!

n°446028
ratibus
Posté le 02-07-2003 à 10:36:19  profilanswer
 

grohark a écrit :

voilà le code que j'ai fait :
 
$session = fopen ("source.tmp", "r" );
$contenu = fread ($session, filesize ("source.tmp" ));
$text = preg_replace("/<span class=\"txtbld\">(.+?)</span>/si","$1",$contenu);
echo"$text";
 
et ça met comme erreur :  
Warning: Unknown modifier 'p'
 
à la ligne : $text = preg_replace("/<span class=\"txtbld\">(.+?)</span>/si","$1",$contenu);
 
aidez moi !! ça m'enerve !!


 
 
preg_replace("/<span class=\"txtbld\">(.+?)<\/span>/si","$1",$contenu);
 
j'enléverais le point d'interrogation aussi pour ne laisser que le plus ( + => 1 occurence ou plus; ? => 0 ou 1 occurrence)


Message édité par ratibus le 02-07-2003 à 10:39:16
n°446051
grohark
Posté le 02-07-2003 à 10:55:57  profilanswer
 

merci ca va bcp mieux en mettant l'antislash.
mais maintenant j'ai un autre problème, quand j'affiche $text, bin en fait ça affiche tout le source comme si l'expression réguière n'avais rien fait.
 
une idée ?? un soupçon ? ou est le coupable ?

n°446064
ratibus
Posté le 02-07-2003 à 11:03:01  profilanswer
 

grohark a écrit :


$text = preg_replace("/<span class=\"txtbld\">(.+?)</span>/si","$1",$contenu);


 
il sert à koi ce "s"

n°446081
grohark
Posté le 02-07-2003 à 11:10:41  profilanswer
 

bonne question ?!
en fait je suis aller voir le lien de THEniluje, ne connaissant rien aux expressions régulières, j'ai fait betement un copier/coller.
si c'est un option de recherche, j'ai un bouquin qui me dit : le metacaractere point(.) remplace n'importe quel caractère, y compris les nouvelles lignes.

n°446082
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-07-2003 à 11:11:35  profilanswer
 

le s à la fin de la regex sert à preciser que le motif peut être sur plusieurs lignes.
Attention le ? dans (.+?) ne veut pas du tout dire 0 ou 1 à cet endroit la, il sert à restreindre la recherche au plus petit motif trouvable.
Par exemple si j'ai le texte

Code :
  1. <span class="txbld>blablabla<span class="txtbld">blablabla</span></span>


Sans le ? ça va me retourner:  

Code :
  1. blablabla<span class="txtbld">blablabla


 
quand a ton probleme grohark vérifie bien que ton motif décrit exactement ce que tu peux trouver dans ton texte. Par exemple que tu n'as pas des espaces après les class="txtbld" ou dans les balises de fermetures des spans.  
Si c'est pas ça montre un bout du text que tu voudrais récuperer.

n°446104
grohark
Posté le 02-07-2003 à 11:29:33  profilanswer
 

je pense que mon motif décrit exactement ce que tu peux trouver dans ton texte.
ce qu'il y a dans mon texte à cette tête là :
<span class="txtbld">Au Jardin d'Aladin  </span>
et donc ça revient plusieurs fois avec un texte différent entre les balises.

mood
Publicité
Posté le 02-07-2003 à 11:29:33  profilanswer
 

n°446118
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-07-2003 à 11:44:20  profilanswer
 

bin en même temps essaye juste ce bout de script:

Code :
  1. <?
  2.   $contenu = '<span class="txtbld">Au Jardin d\'Aladin  </span>
  3.   <span class="txtbld">Au Jardin
  4.   d\'Aladin  </span><span class="txtbld">Au Jardin d\'Aladin  </span><span class="txtbld">Au Jardin d\'Aladin  </span>';
  5.   $text = preg_replace("/<span class=\"txtbld\">(.+?)<\/span>/si", "$1" ,$contenu);
  6.   echo $text;
  7. ?>


Tu verras qu'il marche donc que ta regex est correcte.

n°446440
grohark
Posté le 02-07-2003 à 15:33:40  profilanswer
 

en fait je doute.
si je modifie $contenu de la façon suivante, il m'affiche le au jardin d'aladin en rouge et il m'affiche toto.
 
<?php
$contenu = '<font color=red><span class="txtbld">Au Jardin d\'Aladin  </span></font><span class="txtbld">Arizona   (SARL)</span><span class="txtbld">Au Jardin d\'Aladin  </span><span class="txtbld">Au Jardin d\'Aladin  </span><font size="2">toto</font>';
$text = preg_replace("/<span class=\"txtbld\">(.+?)<\/span>/si", "$1" ,$contenu);
echo $text;
?>

n°446451
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-07-2003 à 15:41:43  profilanswer
 

en executant exactement ce que tu as ecrit j'obtiens :

Code :
  1. <font color=red>Au Jardin d'Aladin  </font>Arizona   (SARL)Au Jardin d'Aladin  Au Jardin d'Aladin  <font size="2">toto</font>


Ce qui est exactement ce que tu es censé obtenir avec le replace et la regex.
Maintenant je pense comprendre que ça ne fait pas du tout ce que tu veux. En fait comme tu le disais au premier message, toi tu veux recuperer ce qu'il y a dans les balises:<span class="txtbld">...</span> correct?
 
Au quel cas c'est pas du tout preg_replace qu'il faut utiliser mais preg_match_all avec la même regex. Attention preg_match_all retourne un tableau de tableau.


Message édité par anapajari le 02-07-2003 à 15:42:59
n°446469
grohark
Posté le 02-07-2003 à 16:02:20  profilanswer
 

ça fonctionne !! je te remercie de ta patience Anapajari !
 
donc au final, la code est :
 
 

Code :
  1. <?php
  2. $contenu = '<font color=red><span class="txtbld">Au Jardin d\'Aladin  </span></font><span class="txtbld">Arizona   (SARL)</span><span class="txtbld">Au Jardin d\'Aladin  </span><span class="txtbld">Au Jardin d\'Aladin  </span><font size="2">toto</font>';
  3. preg_match_all("/<span class=\"txtbld\">(.+?)<\/span>/si", $contenu ,$result);
  4. for($i=0; $i<count($result[0]);$i++){
  5. print $result[0][$i];
  6. }
  7. ?>

n°446571
grohark
Posté le 02-07-2003 à 17:13:55  profilanswer
 

finalement ce n'est pas fini  :cry:  
si il y a des saut de lignes entre les balises, ça ne marche plus...
rien ne vaut un exemple pour ce faire comprendre :
 

Code :
  1. <font color="#FFFFFF"><font color="#666666">19 r Etuve
  2.                         - 25200 MONTBELIARD<br>
  3.                         </font>

 
donc voilà je veux l'adresse mais elle sur plusieurs dans le source.
embêtant

n°447360
grohark
Posté le 03-07-2003 à 11:39:13  profilanswer
 

un dernier petit effort s'il vous plait...
on est presque au bout de ce problème.

n°447412
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-07-2003 à 12:12:02  profilanswer
 

utilise la regex suivante:

Code :
  1. /<span class=\"txtbld\">(.+?)<\/span>/sim


 
[edit] enlevage de conneries [/edit]


Message édité par anapajari le 03-07-2003 à 15:39:34
n°447527
grohark
Posté le 03-07-2003 à 14:11:52  profilanswer
 

est-ce normal que le tableau de résultats contienne les balises html qui me servent de repères ?
c-à-d <span class="txtbld">Au jardin d'Aladin</span>
je pensais que ça allait contenir que ce qu'il y a entre les balises ?!

n°447584
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-07-2003 à 14:42:22  profilanswer
 

et dis tu voudrais pas lire la doc des fois avant de poser tes questions....

Citation :

http://fr.php.net/manual/fr/functi [...] ch-all.php a dit:
$matches[0][0] contient le texte qui satisfait le masque complet, $matches[0][1] contient le texte de la première parenthèse capturante

n°447641
grohark
Posté le 03-07-2003 à 15:17:16  profilanswer
 

oups désolé j'aurais pu lire surtout que j'ai le bouquin sous les yeux. (honte à moi...)
cela dit, petite rectification :  
 

Citation :

$matches[0][0] contient le texte qui satisfait le masque complet, $matches[0][1] contient le texte de la première parenthèse capturante


 mais plutot
 

Citation :

$matches[0] est un tableau qui contient les résultats qui satisferontle masque complet, $matches[1] est un tableau qui contient les résultats qui satisferont la première parenthèse capturante

n°447668
grohark
Posté le 03-07-2003 à 15:32:53  profilanswer
 

j'ai encore une question (eh oui... c'est pas loin d'être la dernière)
si il y a un saut de ligne entre les balises repères, ça se passe comment ?

n°447674
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-07-2003 à 15:41:30  profilanswer
 

Raaah t'abuses quand même  :kaola:  
 

Anapajari a déjà écrit un peu plus haut :

le s à la fin de la regex sert à preciser que le motif peut être sur plusieurs lignes.


 
en plus c'est aussi marqué la:
http://fr.php.net/manual/fr/pcre.pattern.modifiers.php et ça doit être la page d'avant dans ton livre.
 

n°447687
grohark
Posté le 03-07-2003 à 15:51:18  profilanswer
 

ba voui je sais bien mais pourquoi quand je fais ça :  
 
 

Code :
  1. preg_match_all("/<font color=\"#000000\"><b>(.+?)<\/b><\/font><\/td>/sim", $contenu, $tel);
  2. for($j=0; $j<count($tel[1]);$j++){
  3. print ($tel[1][$j]."<br>" );
  4. }

 
 
bin il me sort rien du tout !!!! alors qu'il y a bien qqchose !!
soit je suis pourri bulbe  soit c'est qqchose de très con !!
 
petite précision, il y a un saut de ligne entre <font color=\"#000000\"> et <b>
 

n°447710
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-07-2003 à 16:13:42  profilanswer
 

Bin evidemment ça peut pas marcher ton truc quand tu ecris:

Code :
  1. <font color=\"#000000\"><b>(.+?)<\/b><\/font><\/td>/(.+?)<\/b><\/font><\/td>/sim


Le s a la fin sert à dire si il y a des retour à la ligne au milieu du (.+?) c'est pas grave considérer les comme des caractères normaux.
le m c'estinutile ( et c'était une connerie que j'avais ecrit plus haut) vire le, tu as juste besoin de "si" dans ton cas.
 
Bref pourquoi ça peut pas marcher. Si tu as le texte suivant

Code :
  1. <font color=\"#000000\">
  2. <b>...<\/b><\/font><\/td>


Dans $contenu tu auras:

Code :
  1. <font color=\"#000000\">\n<b>...<\/b><\/font><\/td>

donc forcément ta regex va pas marcher...
 
Mais je pense que tu t'emmerdes pour rien. Tu cherches à recuperer des numeros de téléphones non? ils sont tous ecrit pareils non? moi je travaillerais plutot la dessus...
 
Et si t'as pas envie vires tous les \n de $contenu.


Message édité par anapajari le 03-07-2003 à 16:15:18
n°447778
grohark
Posté le 03-07-2003 à 16:53:12  profilanswer
 

je ne peux pas virer les \n dans le code.
effectivement je veux récupérer des numéro de téléphone, qui sont tous identiques. je vais me pencher sur la question.

n°450147
grohark
Posté le 07-07-2003 à 13:47:28  profilanswer
 

une fois de plus je dois avouer mon incompétence en matière d'expressions régulières.
j'ai potassé un peu les docs sur le sujet, mais ça reste quand même obscure pour moi.
Donc si qq1 à encore pitié  :( j'aimerai avoir une regexp qui me permet d'extraire les numéros de téléphone de la forme xx xx xx xx xx
 
encore une fois merci.

n°450190
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-07-2003 à 14:27:06  profilanswer
 

bon solution bourrin mais qui marche :

Code :
  1. /(\d\d.\d\d.\d\d.\d\d.\d\d)/


Les points c'est pour n'importe quel caractère, donc si ton telephone est comme ça: 00/11/22/33/44 ça marche quand même. Euh par contre si tu as un nombre type 44433322211100 ça le ramenera aussi donc fait gaffe.
 
Solution un peu plus fine:

Code :
  1. /((\d\d(.?)){4})/


Mais la c'est de têtet et je suis pas 100% sur.

n°450241
grohark
Posté le 07-07-2003 à 15:06:27  profilanswer
 

la première méthode me va plutot bien, la 2e récupère en tas de choses (des % entre autres).
par contre pour la 1ère, j'ai 5 fois à la suite le même résultat alors qu'il n'y est qu'une fois ?

n°450251
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-07-2003 à 15:14:21  profilanswer
 

Si t'es sur d'avoir tous les telephones, fait un array_unique sur ton tableau de resultat.
Si jamais il t'en manque et qu'en plus certains reviennent plusieurs fois c'est que j'ai du me trompé sur la regex.

n°450376
grohark
Posté le 07-07-2003 à 16:39:47  profilanswer
 

c'est cool ça fonctionne !
petite remarque sur la fonction array_unique que je trouve un peu bizarre :
ça dédoublonne parfaitement mais ça laisse les cases du tableau vides, je trouve que ce n'est pas pratique si ensuite on veut faire faire un count()...
 
enfin bref le principal est fait, merci bien !

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  expressions régulières et balises HTML

 

Sujets relatifs
[HTML/JS] Une fenêtre fille peut-elle fermer sa mère ?[ASP]decodage de HTML
[JSP][JAVA] Connaitre la taille de la page HTML[HTML] Mozilla et les <li> / <ul>
[HTML/CSS] Ecrire à droite de la dernière ligne d'une <div>Ouvrir MSN avec un lien html
Convertion d'une DOC en HTML en format word, pdf ou autre...[HTML/JS] Problème de Refresh
[HTML - PRO] Masquer l'accès à une ancre de balisage[HTML] Newb: image dans une autre fenêtre
Plus de sujets relatifs à : expressions régulières et balises HTML


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR