Question

J'ai un fichier source avec un formulaire de sélection avec certaines options, comme ceci:

<option value="TTO">1031</option><option value="187">187</option><option value="TWO">2SK8</option><option value="411">411</option><option value="AEL">Abec 11</option><option value="ABE">Abec11</option><option value="ACE">Ace</option><option value="ADD">Addikt</option><option value="AFF">Affiliate</option><option value="ALI">Alien Workshop</option><option value="ALG">Alligator</option><option value="ALM">Almost</option>

Je voudrais lire ce fichier en utilisant php et regex, mais je ne sais pas vraiment comment faire. Quelqu'un a une idée? Ce serait bien d'avoir un tableau avec le code à 3 chiffres comme clé et la chaîne plus longue comme valeur. (ainsi, par exemple, $ arr ['TWO'] == '2SK8')

Était-ce utile?

La solution

<?php                      
$options= '
<option value="TTO">1031</option><option value="187">187</option><option value="TWO">2SK8</option><option value="411">411</option><option value="AEL">Abec 11</option><option value="ABE">Abec11</option><option value="ACE">Ace</option><option value="ADD">Addikt</option><option value="AFF">Affiliate</option><option value="ALI">Alien Workshop</option><option value="ALG">Alligator</option><option value="ALM">Almost</option>
';
preg_match_all( '@(<option value="([^"]+)">([^<]+)<\/option>)@', $options, $arr);

$result = array();
foreach ($arr[0] as $i => $value)
{
    $result[$arr[2][$i]] = $arr[3][$i];
}
print_r($result);
?>

sortie:

Array
(
    [TTO] => 1031
    [187] => 187
    [TWO] => 2SK8
    [411] => 411
    [AEL] => Abec 11
    [ABE] => Abec11
    [ACE] => Ace
    [ADD] => Addikt
    [AFF] => Affiliate
    [ALI] => Alien Workshop
    [ALG] => Alligator
    [ALM] => Almost
)

Autres conseils

Qu'en est-il de quelque chose comme ceci:

$html = <<<HTML
<option value="TTO">1031</option><option value="187">187</option>
<option value="TWO">2SK8</option><option value="411">411</option>
<option value="AEL">Abec 11</option><option value="ABE">Abec11</option>
<option value="ACE">Ace</option><option value="ADD">Addikt</option>
<option value="AFF">Affiliate</option><option value="ALI">Alien Workshop</option>
<option value="ALG">Alligator</option><option value="ALM">Almost</option>
HTML;

$matches = array();
if (preg_match_all('#<option\s+value="([^"]+)">([^<]+)</option>#', $html, $matches)) {
    $list = array();

    $num_matches = count($matches[0]);
    for ($i=0 ; $i<$num_matches ; $i++) {
        $list[$matches[1][$i]] = $matches[2][$i];
    }

    var_dump($list);
}

La sortie ($list) serait:

array
  'TTO' => string '1031' (length=4)
  187 => string '187' (length=3)
  'TWO' => string '2SK8' (length=4)
  411 => string '411' (length=3)
  'AEL' => string 'Abec 11' (length=7)
  'ABE' => string 'Abec11' (length=6)
  'ACE' => string 'Ace' (length=3)
  'ADD' => string 'Addikt' (length=6)
  'AFF' => string 'Affiliate' (length=9)
  'ALI' => string 'Alien Workshop' (length=14)
  'ALG' => string 'Alligator' (length=9)
  'ALM' => string 'Almost' (length=6)

Quelques explications:

  • J'utilise preg_match_all pour faire correspondre le plus de fois possible
  • ([^"]+) signifie & "tout ce qui n’est pas une double guillemet (comme cela marquerait la fin du value), au moins une fois et autant de fois que possible (+ )
  • ([^<]+) signifie à peu près la même chose, mais avec < au lieu de " comme marqueur de fin
  • $matches[1] me fournira un tableau contenant dans () la liste de tous les éléments correspondant au premier ensemble de $matches[2], et dans DOMDocument::loadHTML ce qui correspond au deuxième ensemble de <=>
    • je dois donc parcourir les résultats pour reconstruire la liste qui vous a été: -)

J'espère que cela vous aidera - et que vous comprendrez ce que cela fait et comment, pour pouvoir vous aider vous-même, la prochaine fois ; -)


En tant que sidenote: utiliser regex pour & Quot; analyser & "; HTML n'est généralement pas une bonne idée ... Si vous avez une page HTML complète, vous pouvez jeter un oeil à <=> .
Si vous n'aimez pas et que le format des options n'est pas bien défini ... Eh bien, peut-être qu'il pourrait être utile d'ajouter des éléments à la regex, par précaution ... (comme si vous acceptiez des espaces ici et là, acceptant d'autres attributs, ...)

Essayez ceci. Il suffit de charger le contenu du fichier dans $raw_html et d’utiliser cette expression régulière pour collecter les correspondances. Le code à 3 chiffres de la $i ème option est $out[i][1] et la chaîne la plus longue est $out[i][2]. Vous pouvez convertir cela en un tableau associatif si nécessaire.

$regex = '|<option value="(.{3})">([^<]+)</option>|';
preg_match_all($regex, $raw_html, $out, PREG_SET_ORDER);

print_r($out);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top