Regex ile bir select etiketi (php) ayrıştırmak

2 Cevap php

PHP tüm seçenek etiketleri değerleri ve içerik için özel bir seçme etiketi taramak istiyorum. Öyle ki, bu ikinci

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

Ben böyle bir şey olsun istiyorum:

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

Ve bunun için çalıştı:

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

Ama ben sadece aşağıdaki kod ile tek bir satır (sonuncusu) olsun:

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

Ne yapmam gerekir?

2 Cevap

Sen iyisi gerçek bir ayrıştırıcı kullanmak gerekir:

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

Desen

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

Eğer ihtiyacınız olan tüm verileri kapmak gerekir. Sonra sadece arzu dizi oluşturmak maçlarda yinelemek gerekiyor.