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

output:

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),至少一次,并且尽可能多的 ( +)
  • ([^<]+)意思差不多,但用<而不是"作为结束标记
  • preg_match_all会给我一个数组,其中包含$matches[1]与第一组匹配的所有内容的列表(),以及$matches[2]与第二组匹配的内容()
    • 所以我需要遍历结果以重新构建让您感兴趣的列表:-)

希望这会有所帮助 - 并且您了解它的作用和方式,以便下次您可以帮助自己;-)


作为旁注:使用正则表达式来“解析”HTML 通常不是一个好主意......如果你有一个完整的 HTML 页面,你可能想看看DOMDocument::loadHTML.
如果你不这样做并且选项的格式没有明确定义......好吧,作为预防措施,向正则表达式添加一些东西可能会证明是有用的...... (就像在这里和那里接受空格,接受其他属性, ...)

于 2009-08-03T19:00:13.040 回答
2

Try this out. Just load the file's contents into $raw_html and use this regex to collect the matches. The 3-digit code from the $ith option is $out[i][1], and the longer string is $out[i][2]. You can convert that to an associative array as needed.

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

print_r($out);
于 2009-08-03T19:03:59.943 回答