2009-08-03 57 views
2

我有一个选择的形式与一些选项的源文件,如:PHP的正则表达式来读取选择形式

<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和正则表达式这个文件,但我真的不知识。任何人有个想法?将3位数字代码作为关键字的数组以及较长的字符串作为值将会很好。 (因此,例如,$改编[ '二'] == '2SK8')

回答

4
<?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 
) 
2

什么是这样的:

$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]什么匹配第二套()
    • 所以我需要遍历结果,以重新构建inetrestes你:-)

希望这有助于列表 - 和你了解它做什么和怎么样,这样你就可以帮助自己,接下来的时间;-)


一点题外话:使用正则表达式来“解析” HTML通常不是个好主意......如果你有一个完整的HTML页面,你可能要采取看看DOMDocument::loadHTML
如果你不这样做,并且选项的格式没有明确的定义...那么,也许这可能是有用的东西添加到正则表达式,作为一种预防措施... (喜欢接受空间在这里和那里,接受其他属性,...)

+0

这听起来是正确的,但你会得到一个更美妙的交易出array_combine()的: $名单= array_combine($比赛[1],$比赛[2]); – 2009-08-03 19:05:39

+0

Ergh,我从来没有想过那些那些:-(谢谢你的提示 – 2009-08-03 19:07:01

2

试试看。只需将文件内容加载到$raw_html并使用此正则表达式来收集匹配。 $i th选项的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);