我想在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);
我该怎么办?
答案 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>
应该抓住你需要的所有数据。然后你只需要迭代匹配来构建你想要的数组。