expressions régulières et balises HTML

expressions régulières et balises HTML - PHP - Programmation

Marsh Posté le 01-07-2003 à 16:23:54    

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

Reply

Marsh Posté le 01-07-2003 à 16:23:54   

Reply

Marsh Posté le 01-07-2003 à 23:41:55    

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

Reply

Marsh Posté le 02-07-2003 à 09:01:33    

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).

Reply

Marsh Posté le 02-07-2003 à 10:25:15    

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 !!

Reply

Marsh Posté le 02-07-2003 à 10:36:19    

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
Reply

Marsh Posté le 02-07-2003 à 10:55:57    

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 ?

Reply

Marsh Posté le 02-07-2003 à 11:03:01    

grohark a écrit :


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


 
il sert à koi ce "s"

Reply

Marsh Posté le 02-07-2003 à 11:10:41    

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.

Reply

Marsh Posté le 02-07-2003 à 11:11:35    

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.

Reply

Marsh Posté le 02-07-2003 à 11:29:33    

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.

Reply

Marsh Posté le 02-07-2003 à 11:29:33   

Reply

Marsh Posté le 02-07-2003 à 11:44:20    

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.

Reply

Marsh Posté le 02-07-2003 à 15:33:40    

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;
?>

Reply

Marsh Posté le 02-07-2003 à 15:41:43    

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
Reply

Marsh Posté le 02-07-2003 à 16:02:20    

ç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. ?>

Reply

Marsh Posté le 02-07-2003 à 17:13:55    

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

Reply

Marsh Posté le 03-07-2003 à 11:39:13    

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

Reply

Marsh Posté le 03-07-2003 à 12:12:02    

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
Reply

Marsh Posté le 03-07-2003 à 14:11:52    

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 ?!

Reply

Marsh Posté le 03-07-2003 à 14:42:22    

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

Reply

Marsh Posté le 03-07-2003 à 15:17:16    

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

Reply

Marsh Posté le 03-07-2003 à 15:32:53    

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 ?

Reply

Marsh Posté le 03-07-2003 à 15:41:30    

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.
 

Reply

Marsh Posté le 03-07-2003 à 15:51:18    

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>
 

Reply

Marsh Posté le 03-07-2003 à 16:13:42    

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
Reply

Marsh Posté le 03-07-2003 à 16:53:12    

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.

Reply

Marsh Posté le 07-07-2003 à 13:47:28    

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.

Reply

Marsh Posté le 07-07-2003 à 14:27:06    

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.

Reply

Marsh Posté le 07-07-2003 à 15:06:27    

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 ?

Reply

Marsh Posté le 07-07-2003 à 15:14:21    

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.

Reply

Marsh Posté le 07-07-2003 à 16:39:47    

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 !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed