Разобрать тег select с помощью регулярных выражений (php) - PullRequest
0 голосов
/ 01 апреля 2009

Я хотел бы отсканировать определенный тег select для всех значений и содержимого option-тегов в PHP. Так что из этого

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

Но я получаю только одну строку (последнюю) со следующим кодом:

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

Как мне поступить?

Ответы [ 2 ]

4 голосов
/ 01 апреля 2009

Вам лучше использовать реальный парсер:

$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);
3 голосов
/ 01 апреля 2009

Узор

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

Должен собрать все необходимые данные. Тогда вам просто нужно перебрать совпадения, чтобы построить нужный вам массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...