2009-03-31 9 views
0

PHPのオプションタグの値と内容すべてについて、特定のselectタグをスキャンしたいと思います。このregex(php)を使ってselectタグを解析する

<select> 
<option value="donald">duck</option> 
<option value="david">moose</option> 
</select> 
<select id="something"> <!--ignore this one --> 
<option value="sdfas">fs</option> <!-- ignore this one --> 
... 

から、私はこのようなものになるだろうように:

$result['value'][0] == "donald" 
$result['content'][1] == "moose" 

をそして、そのために私が試した:

<select>(?:[\s]*<option value="(?P<value>[^"]*)"> 
(?P<content>[^<]*)</option>)*[\s]*</select> 

しかし、私は唯一の単一の行(最後の1)を取得次のコードを使用してください:

preg_match_all('%<select>(?:[\s]*<option value="(?P<value>[^"]*)"> 
(?P<content>[^<]*)</option>)*[\s]*</select>%', 
$contents, $result, PREG_SET_ORDER); 

私は進めるべきですか?

答えて

4

あなたはより良い本物のパーサーを使用する必要がありますいくつかの選択のタグが、私は必要なオプションのタグを持っているだけであり

$doc = new DOMDocument(); 
$doc->loadHTML($str); 

$xpath = new DOMXPath($doc); 
$result = array('value'=>array(), 'content'=>array()); 
foreach ($xpath->query('//body/select[count(@*)=0]/option') as $node) { 
    $result['value'][] = $node->getAttribute('value'); 
    $result['content'][] = $node->textContent; 
} 
var_dump($result); 
+0

+1。正規表現はHTMLを解析できません。正規表現を使ってHTMLを解析しないでください。行かないでください。 £200を徴収しないでください。 – bobince

+0

確かに良い解決策です。私は(誤って)彼がただ一つの選択要素を解析すると仮定していました。 –

3

あなたが必要なすべてのデータをつかむべき

<option value="(.*?)">(.*?)</option> 

パターン。次に、あなたが望む配列を構築するために試合を繰り返すだけです。

+0

を。 –

関連する問題