Ereg ?

yuccaV2 Messages postés 4 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 3 mars 2010 - 1 mars 2010 à 14:20
yuccaV2 Messages postés 4 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 3 mars 2010 - 3 mars 2010 à 09:04
Bonjour je souhaite extraire le contenu altText dans une balise image, j'imagine avec ereg.

-> je cherche a obtenir une variable contenant "altText" (enfin, sans les guillemets).
J'ai cherché à le faire avec les eregs, mais vraiment j'y comprend rien.
Si quelqu'un peut me donner la formule... Et une ou deux explications.
merci d'avance.

yuccaV2

9 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
1 mars 2010 à 19:03
Salut,

Un petite citation du manuel PHP concernant toutes les fonctions de la famille de ereg :
Cette fonction est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.


Bref, commence donc plutôt à utiliser preg_match(). Si besoin tu trouvera des cours sur expreg.com.
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010
1 mars 2010 à 20:35
Bonjour,

L'expression régulière n'est pas excessivement compliquée à partir du moment ou tu veux n'extraire que le contenu de l'attribut alt.

Pour faire simple, exprime d'abord ce que tu veux en français :

-> tous les caractères qui sont entre les guillemets qui suivent la chaine alt =

En expression régulière ça donne :

->qui suivent la chaine alt = => $regexp = 'alt =';
-> entre les guillements qui suivent alt = => $regexp = 'alt =""';
-> n'importe quel caractère entre ces guillemets => $regexp = 'alt ="(.+?)"';

Petites précisions sur la partie dynamique de l'expression :

->Le point (.) signifie n'importe quel caractère.
-> Le + signifie de 1 à n répétitions. Donc .+ signifie de 1 à n fois n'importe quel caractère
-> Le ? rend la recherche "fainéante". C'est à dire qu'elle va s'arrêter dès qu'elle aura trouver le plus petit bout de chaîne qui correspond. Avec .+? tout seul ça signifierait 1 seul caractère, mais comme après il y a un guillemet, la recherche prendra tous les caractères qu'elle trouvera jusqu'à trouver un guillemet. Sans le ?, la recherche pourrait continuer jusqu'au guillemet fermant de l'attribut title.
-> Les parenthèses permettent d'indiquer la partie que l'on veut extraire pour la réutiliser (en gros).


Maintenant que tu as la regexp, il ne te reste plus qu'à utiliser ta fonction (preg_match pour faire plaisir au monsieur ci-dessus ;) )

<?php
$matches = array();
$regexp '/alt"(.+?)"/';
//Les slashs au debut et à la fin sont des délimiteurs, tu peux utiliser n'importe quel caractère à condition que ce soit le même au début et à la fin et qu'il ne soit pas utiliser dans l'expression elle même

preg_match($code_html, $regexp, $matches);

//Si ca match, le tableau $matches contiendra la chaîne matchée par l'expression complète en 0 et ce qui est entre les parenthèses en 1)

?>


Attention, je n'ai pas pris en compte les possibles espaces blancs avant ou après le = mais je suis sur que tu sauras ajouter ça toi même. Petit indice, un caractère blanc s'exprime par \s dans une regexp (le backslash est volontaire, c'est pas une faute de frappe).

Bon courage à toi.



Grrrrrrrrrrr
0
yuccaV2 Messages postés 4 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 3 mars 2010
2 mars 2010 à 11:26
Alors là je dis merci pour le temps consacré, bravo pour l'aspect didactique, et chapeau bas. C'est plus pédagogique et plus clair que tout ce que j'ai pu trouver sur le sujet. Je garde cette réponse précieusement car elle m'indique enfin ce que signifie les "?", les ".+" et tout le reste.

Bon maintenant... Ça ne fonctionne pas mais ça ne doit pas être grand chose.
Voici mon bout de code :

<?php
$code_html='';
$matches = array();
$regexp = '/alt \s="(.+?)"/';
preg_match($code_html, $regexp, $matches);

echo $matches[0];
echo $matches[1];
?>

Donne aucun retour. J'ai essayé aussi sans le \s (et encore merci pour la signification).


yuccaV2
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
2 mars 2010 à 12:35
Salut,

Le ? rend la recherche "fainéante". C'est à dire qu'elle va s'arrêter dès qu'elle aura trouver le plus petit bout de chaîne qui correspond. Avec .+? tout seul ça signifierait 1 seul caractère, mais comme après il y a un guillemet, la recherche prendra tous les caractères qu'elle trouvera jusqu'à trouver un guillemet. Sans le ?, la recherche pourrait continuer jusqu'au guillemet fermant de l'attribut title.

Ou bien utiliser l'option U (U pour ungreedy) qui permet d'appliquer cette règle sur toute la regexp et non juste sur la zone. Précision importante, le point d'interogation à également un sens tout autre : signifier 0 ou 1 occurrence de la classe précédente (exemple : \s? signifie 0 ou 1 espace blanc).

Au passage, le résultat cherché est dans $matches[1] qui est un tableau, utilises plutôt var_dump() ou print_r() pour regarder ce qui s'y trouve au lieux d'un echo.

Maintenant que tu as la regexp, il ne te reste plus qu'à utiliser ta fonction (preg_match pour faire plaisir au monsieur ci-dessus ;) )

Je me suis mal exprimé, par preg_match j'entendai l'utilisation des fonctions de la famille de preg_match, par exemple s'il est possible que plusieurs attributs alt soit présents (plusieurs images), alors c'est preg_match_all() qu'il faut utiliser. Pour reprendre le code ci-dessu :

<?php
$code_html='';
$matches = array();
$regexp = '/alt\s*=\s*"(.+)"/U';
preg_match($code_html, $regexp, $matches);

var_dump($matches[1]);
?>

Vu que $matches[1] est un tableau contenant toutes les occurrences, on obtient ceci :
array(1) {
[0]=>
string(7) "altText"
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yuccaV2 Messages postés 4 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 3 mars 2010
2 mars 2010 à 13:23
J'apprends décidément pleins de trucs utiles... Merci à tous.
Par contre, moi j'obtiens "NULL" avec le code :
<?php
$code_html='';
$matches = array();
$regexp = '/alt\s*=\s*"(.+)"/U';
preg_match($code_html, $regexp, $matches);

var_dump($matches[1]);
?>


Il y a rien dans ce tableau, non ?

yuccaV2
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
2 mars 2010 à 17:52
Désolé, j'ai inversé $code_html et $regexp par erreur.

preg_match($regexp, $code_html, $matches);

Sinon, c'est toujours bon de tester la valeur de retour de preg_match. Vu que cette fonction renvoie le nombre de fois où ça a matché on peu éviter de faire plein de trucs inutiles quand le motif n'a jamais été trouvé (retour 0) ou en cas d'erreur (retour NULL).
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
2 mars 2010 à 19:04
Salut,

Juste une broutille en passant :
Je ne suis pas certain que des espaces avant ou/et après le = soient valides. Question "bonnes pratiques" surement pas.
Par contre il ma parait nécessaire d'en mettre un avant le alt (dans la regex) afin de limiter la possibilité (par ex) d'une fin en 'alt=' dans la src.
Il faudrait aussi prendre en compte que l'attribut alt n'est pas propre à la balise img et qu'il peut apparaitre ailleurs dans le code.


Cordialement,


Kohntark -
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010
2 mars 2010 à 20:22
Je prend note du flag U, je connaissais pas, merci pour l'info.

Au passage, pour yuccaV2, tu peux trouver des logiciels qui te permettent de tester tes regexp facilement (genre regexp builder).

Pour ce qui est des bases des expressions régulières (genre le +, le * ou le .) tu peux facilement trouver un tutorial sur le net. Allez au hasard : http://www.siteduzero.com/tutoriel-3-14663-memo-pour-les-regex.html

Bon amusement.



Grrrrrrrrrrr
0
yuccaV2 Messages postés 4 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 3 mars 2010
3 mars 2010 à 09:04
Top merci à tous.
Ça marche nickel.
0
Rejoignez-nous