2

次のようないくつかのオプションを備えた選択フォームを含むソースファイルがあります。

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

phpとregexを使用してこのファイルを読みたいのですが、方法がわかりません。誰かアイデア?3桁のコードをキーとして、長い文字列を値として持つ配列があると便利です。(たとえば、$ arr ['TWO'] == '2SK8')

4

3 に答える 3

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

出力:

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
)
于 2009-08-03T19:04:50.643 に答える
3

このようなものはどうですか:

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

出力($list)は次のようになります:

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)

いくつかの説明:

  • 私はpreg_match_allできるだけ多くの回数を一致させるために使用しています
  • ([^"]+)は、「二重引用符ではないものすべて(の終わりを示すためvalue)、少なくとも1回、可能な限り多くの回数(+)を意味します。
  • ([^<]+)ほぼ同じことを意味しますが、エンドマーカー<の代わりに"
  • preg_match_all$matches[1]の最初のセットに一致したすべてのもののリストに含まれている配列()$matches[2]、の2番目のセットに一致したものを含む配列を取得します()
    • だから私はあなたを興味をそそるリストを再構築するために結果を繰り返す必要があります:-)

これがお役に立てば幸いです-そしてあなたがそれが何をどのように行うかを理解したので、次回はあなた自身を助けることができます;-)


補足として:正規表現を使用してHTMLを「解析」することは、一般的にあまり良い考えではありません...完全なHTMLページがある場合は、を参照してくださいDOMDocument::loadHTML
そうしないと、オプションの形式が明確に定義されていない場合...まあ、予防策として、正規表現にいくつかのものを追加すると便利な場合があります... (あちこちのスペースを受け入れるように、他のスペースを受け入れるように属性、...)

于 2009-08-03T19:00:13.040 に答える
2

これを試してみてください。ファイルの内容をにロードし、$raw_htmlこの正規表現を使用して一致を収集するだけです。$ithオプションの3桁のコードは$out[i][1]、で、長い方の文字列は。です$out[i][2]。必要に応じて、それを連想配列に変換できます。

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

print_r($out);
于 2009-08-03T19:03:59.943 に答える