Pregunta

Tengo un archivo de código fuente con un formulario con algunas opciones, como este:

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

Me gustaría leer este archivo usando php y regex, pero yo realmente no sé cómo.A nadie una idea?Sería bueno tener un array con los 3 dígitos de código como clave, y la cadena más larga como un valor.(así, por ejemplo, $arr['DOS'] == '2SK8')

¿Fue útil?

Solución

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

salida:

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
)

Otros consejos

¿Qué pasa con algo como esto?

$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);
}

El resultado ($list) sería:

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)

Algunas explicaciones:

  • Estoy usando preg_match_all para coincidir tantas veces como sea posible
  • ([^"]+) significa " todo lo que no sea una comilla doble (ya que marcaría el final de value), al menos una vez y tantas veces como sea posible (+ )
  • ([^<]+) significa casi lo mismo, pero con < en lugar de " como marcador final
  • $matches[1] me dará una matriz que contiene en () la lista de todas las cosas que coincidieron con el primer conjunto de $matches[2], y en DOMDocument::loadHTML lo que coincidió con el segundo conjunto de <=>
    • así que necesito iterar sobre los resultados para reconstruir la lista que te interesa :-)

Espero que esto ayude, y que haya entendido lo que hace y cómo, para que pueda ayudarse a sí mismo la próxima vez ;-)


Como nota al margen: uso de expresiones regulares para & Quot; analizar & Quot; HTML generalmente no es una buena idea ... Si tiene una página HTML completa, puede echar un vistazo a <=> .
Si no lo hace y el formato de las opciones no está bien definido ... Bueno, tal vez podría ser útil agregar algunas cosas a la expresión regular, como precaución ... (Como aceptar espacios aquí y allá, aceptando otros atributos, ...)

Trate de hacer esto.Sólo tienes que cargar el contenido del archivo en $raw_html y el uso de esta expresión para recoger los partidos.El código de 3 dígitos de la $ith opción es $out[i][1], y la cadena más larga es $out[i][2].Se puede convertir en un array asociativo como sea necesario.

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

print_r($out);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top