Re...
Bon bon, je ne suis pas spécialiste des regex, mais je vais essayer de décortiquer un peu la chose...
Partons donc du principe que nous avons un texte Html de ce type (ce bidon hein

, c'est juste en guise d'exemple) :
$html = '<p>Inter quae [email protected] verbum emicuit
si value="fortes" decorum, et si versus paulo concinnior unus et alter,
iniuste totum ducit venditque poema.</p>
<select>
<option value="y01234">yyyyyyy</option>
<option value="9874xX">xxxxxxx</option>
<option value="zZ33Zz">zzzzzzz</option>
</select>
<div>Non equidem insector une <Option carmina Livi esse, memini quae plagosum
mihi Value="UnoDos" parvo Orbilium dictare; sed emendata videri pulchraque
et exactis /oPtiOn> distantia miror.</div>';
Maintenant, admettons qu'on souhaite récupérer uniquement le contenu de l'attribut "value", ok ?
Une première solution serait d'imaginer le masque suivant :
$masque = '#value="(.*)"#';
Ce qui nous donnerait comme résultat, dans la variable "$liste", avec la fonction "preg_match_all" :
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => value="fortes"
[1] => value="y01234"
[2] => value="9874xX"
[3] => value="zZ33Zz"
)
[1] => Array
(
[0] => fortes
[1] => y01234
[2] => 9874xX
[3] => zZ33Zz
)
)
*/
Ok, jusqu'à là ça ne devrait pas poser de problème, tout fonctionne, nous récupérons un tableau multidimensionnel avec une première liste d'éléments correspondants au masque entier recherché, puis une seconde liste avec seulement les données retournées par les parenthèses capturantes...
Tout est ok... sauf que, is on regarde de plus près, on se s'aperçois qu'on récupère également un attribut "value" qui ne vient pas des balises "option", la toute première : "[0] => fortes"...
Or, c'est uniquement les valeurs des balises "option" que nous souhaitons récupérer, nous devons donc affiner notre masque, en lui donnant comme indication qu'il doit uniquement chercher à l'intérieur des balises "<option" et "option>"... le masque devient quelque chose comme :
$masque = '#<option.*value="(.*)".*option>#';
Et le résultat devrait être :
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => yyyyyyy
[1] => xxxxxxx
[2] => zzzzzzz
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/
Bon, là on a éliminé la valeur qui nous gênait, c'est-à-dire, celle qui n'était pas issue d'une balise "option"...
Mais, c'est bizarre, nous avons apparemment un comportement étrange, en effet, au lieu d'avoir, dans la première liste d'éléments, l'ensemble du texte retourné par le masque, on a seulement les valeurs figurant dans les balises "option"...
Bon, ce n'est qu'une apparence, car en réalité, si on regarde le code source de la page, on constate que les balises "option" ont été entièrement récupérées par le masque... ce qui nous donne donc :
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/
Ok, c'est bon, là on a exactement ce qu'on voulait... on pourrait s'arrêter là, mais il y a peut-être moyen d'optimiser le masque afin qu'il soit plus rapide et efficace.
Comme nous savons exactement ce que l'attribut "value" contient ou, du moins, quelle est sa structure de données, on peut décider de modifier notre parenthèse capturante pour remplacer notre recherche générique "(.*)" par une plus spécifique, telle que tu l'as imaginé par exemple "([A-Z09]{6})", on test :
$masque = '#<option.*value="([A-Z0-9]{06})".*option>#';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
)
[1] => Array
(
)
)
*/
Et là, damned

plus rien du tout
Et oui, nous devons indiquer au masque que la recherche doit se faire insensible à la casse (insensible aux majuscules et minuscules), on ajoute donc l'option "i" qui est justement prévue à cet effet... on re-test :
$masque = '#<option.*value="([A-Z0-9]{06})".*option>#i';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
[3] => <Option carmina Livi esse, memini quae plagosum mihi
Value="UnoDos" parvo Orbilium dictare; sed emendata videri pulchraque et exactis /oPtiOn>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
[3] => UnoDos
)
)
*/
Bon, on y était presque... mais on récupère encore un truc ignoble qui traînait en dernière ligne

... comment s'en débarrasser ?
Si on regarde en détail, on constate que les balises "option" présentes dans cette dernière ligne son écrites avec des majuscules et minuscules, il serait donc intéressant, pour éviter de récupérer ces cas de figure, de limiter la recherche aux minuscules uniquement... mais là on doit donc supprimer l'option "i" de notre masque, ce qui est plutôt embêtant puisque les valeurs qu'on cherche peuvent contenir des caractères de différente casse...
Le plus simple, est d'ajouter les minuscules à notre parenthèse capturante tout en éliminant l'option "i" :
$masque = '#<option.*value="([a-zA-Z0-9]{06})".*option>#';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/
Voilà... on a tout bon maintenant !!!
Juste une dernière petite modif et tout sera parfait (enfin, façon de dire

)...
Si jamais, pour une raison ou pour une autre, au lieu d'avoir les balises "option" chacune dans une ligne différente on en trouvait certaines dans la même ligne, alors notre masque produirait un résultat incomplet :
$html = '<p>Inter quae [email protected] verbum emicuit
si value="fortes" decorum, et si versus paulo concinnior unus et alter,
iniuste totum ducit venditque poema.</p>
<select>
<option value="y01234">yyyyyyy</option><option value="9874xX">xxxxxxx</option>
<option value="zZ33Zz">zzzzzzz</option>
</select>
<div>Non equidem insector une <Option carmina Livi esse, memini quae plagosum
mihi Value="UnoDos" parvo Orbilium dictare; sed emendata videri pulchraque
et exactis /oPtiOn> distantia miror.</div>';
$masque = '#<option.*value="([a-zA-Z0-9]{06})".*option>#';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option><option value="9874xX">xxxxxxx</option>
[1] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => 9874xX
[1] => zZ33Zz
)
)
*/
Pour éviter ce soucis, il suffit d'utiliser l'option "U" qui oblige la fonction "preg_match_all" a ne pas étendre sa recherche dès que le masque a été trouvé :
$masque = '#<option.*value="([a-zA-Z0-9]{06})".*option>#U';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/
Voilà... j'espère n'avoir rien oublié... enfin, il y a toujours des cas de figure auxquels on n'a pas pensé, mais bon... ce sera pour une prochaine... (...enfin, si on n'avait que ça à faire...

)
à+

Re... :)
Bon bon, je ne suis pas spécialiste des regex, mais je vais essayer de décortiquer un peu la chose...
Partons donc du principe que nous avons un texte Html de ce type (ce bidon hein ;) , c'est juste en guise d'exemple) :
[php]$html = '<p>Inter quae
[email protected] verbum emicuit
si value="fortes" decorum, et si versus paulo concinnior unus et alter,
iniuste totum ducit venditque poema.</p>
<select>
<option value="y01234">yyyyyyy</option>
<option value="9874xX">xxxxxxx</option>
<option value="zZ33Zz">zzzzzzz</option>
</select>
<div>Non equidem insector une <Option carmina Livi esse, memini quae plagosum
mihi Value="UnoDos" parvo Orbilium dictare; sed emendata videri pulchraque
et exactis /oPtiOn> distantia miror.</div>';[/php]
Maintenant, admettons qu'on souhaite récupérer uniquement le contenu de l'attribut "value", ok ?
Une première solution serait d'imaginer le masque suivant :
[php]$masque = '#value="(.*)"#';[/php]
Ce qui nous donnerait comme résultat, dans la variable "$liste", avec la fonction "preg_match_all" :
[php]preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => value="fortes"
[1] => value="y01234"
[2] => value="9874xX"
[3] => value="zZ33Zz"
)
[1] => Array
(
[0] => fortes
[1] => y01234
[2] => 9874xX
[3] => zZ33Zz
)
)
*/[/php]
Ok, jusqu'à là ça ne devrait pas poser de problème, tout fonctionne, nous récupérons un tableau multidimensionnel avec une première liste d'éléments correspondants au masque entier recherché, puis une seconde liste avec seulement les données retournées par les parenthèses capturantes...
Tout est ok... sauf que, is on regarde de plus près, on se s'aperçois qu'on récupère également un attribut "value" qui ne vient pas des balises "option", la toute première : "[0] => fortes"...
Or, c'est uniquement les valeurs des balises "option" que nous souhaitons récupérer, nous devons donc affiner notre masque, en lui donnant comme indication qu'il doit uniquement chercher à l'intérieur des balises "<option" et "option>"... le masque devient quelque chose comme :
[php]$masque = '#<option.*value="(.*)".*option>#';[/php]
Et le résultat devrait être :
[php]preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => yyyyyyy
[1] => xxxxxxx
[2] => zzzzzzz
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/[/php]
Bon, là on a éliminé la valeur qui nous gênait, c'est-à-dire, celle qui n'était pas issue d'une balise "option"...
Mais, c'est bizarre, nous avons apparemment un comportement étrange, en effet, au lieu d'avoir, dans la première liste d'éléments, l'ensemble du texte retourné par le masque, on a seulement les valeurs figurant dans les balises "option"... :shock:
Bon, ce n'est qu'une apparence, car en réalité, si on regarde le code source de la page, on constate que les balises "option" ont été entièrement récupérées par le masque... ce qui nous donne donc :
[php]/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/[/php]
Ok, c'est bon, là on a exactement ce qu'on voulait... on pourrait s'arrêter là, mais il y a peut-être moyen d'optimiser le masque afin qu'il soit plus rapide et efficace.
Comme nous savons exactement ce que l'attribut "value" contient ou, du moins, quelle est sa structure de données, on peut décider de modifier notre parenthèse capturante pour remplacer notre recherche générique "(.*)" par une plus spécifique, telle que tu l'as imaginé par exemple "([A-Z09]{6})", on test :
[php]$masque = '#<option.*value="([A-Z0-9]{06})".*option>#';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
)
[1] => Array
(
)
)
*/[/php]
Et là, damned :evil: plus rien du tout :(
Et oui, nous devons indiquer au masque que la recherche doit se faire insensible à la casse (insensible aux majuscules et minuscules), on ajoute donc l'option "i" qui est justement prévue à cet effet... on re-test :
[php]$masque = '#<option.*value="([A-Z0-9]{06})".*option>#i';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
[3] => <Option carmina Livi esse, memini quae plagosum mihi
Value="UnoDos" parvo Orbilium dictare; sed emendata videri pulchraque et exactis /oPtiOn>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
[3] => UnoDos
)
)
*/[/php]
Bon, on y était presque... mais on récupère encore un truc ignoble qui traînait en dernière ligne :( ... comment s'en débarrasser ? :shock:
Si on regarde en détail, on constate que les balises "option" présentes dans cette dernière ligne son écrites avec des majuscules et minuscules, il serait donc intéressant, pour éviter de récupérer ces cas de figure, de limiter la recherche aux minuscules uniquement... mais là on doit donc supprimer l'option "i" de notre masque, ce qui est plutôt embêtant puisque les valeurs qu'on cherche peuvent contenir des caractères de différente casse...
Le plus simple, est d'ajouter les minuscules à notre parenthèse capturante tout en éliminant l'option "i" :
[php]$masque = '#<option.*value="([a-zA-Z0-9]{06})".*option>#';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/[/php]
Voilà... on a tout bon maintenant !!! \:D/
Juste une dernière petite modif et tout sera parfait (enfin, façon de dire ;) )...
Si jamais, pour une raison ou pour une autre, au lieu d'avoir les balises "option" chacune dans une ligne différente on en trouvait certaines dans la même ligne, alors notre masque produirait un résultat incomplet :
[php]$html = '<p>Inter quae
[email protected] verbum emicuit
si value="fortes" decorum, et si versus paulo concinnior unus et alter,
iniuste totum ducit venditque poema.</p>
<select>
<option value="y01234">yyyyyyy</option><option value="9874xX">xxxxxxx</option>
<option value="zZ33Zz">zzzzzzz</option>
</select>
<div>Non equidem insector une <Option carmina Livi esse, memini quae plagosum
mihi Value="UnoDos" parvo Orbilium dictare; sed emendata videri pulchraque
et exactis /oPtiOn> distantia miror.</div>';
$masque = '#<option.*value="([a-zA-Z0-9]{06})".*option>#';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option><option value="9874xX">xxxxxxx</option>
[1] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => 9874xX
[1] => zZ33Zz
)
)
*/[/php]
Pour éviter ce soucis, il suffit d'utiliser l'option "U" qui oblige la fonction "preg_match_all" a ne pas étendre sa recherche dès que le masque a été trouvé :
[php]$masque = '#<option.*value="([a-zA-Z0-9]{06})".*option>#U';
preg_match_all($masque, $html, $liste);
print_r($liste);
/*
Array
(
[0] => Array
(
[0] => <option value="y01234">yyyyyyy</option>
[1] => <option value="9874xX">xxxxxxx</option>
[2] => <option value="zZ33Zz">zzzzzzz</option>
)
[1] => Array
(
[0] => y01234
[1] => 9874xX
[2] => zZ33Zz
)
)
*/[/php]
Voilà... j'espère n'avoir rien oublié... enfin, il y a toujours des cas de figure auxquels on n'a pas pensé, mais bon... ce sera pour une prochaine... (...enfin, si on n'avait que ça à faire... ;) )
à+ :)