使用正则表达式解析选择标记(php)

时间:2009-03-31 20:22:47

标签: php html regex

我想在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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

模式

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

应该抓住你需要的所有数据。然后你只需要迭代匹配来构建你想要的数组。