preg_match_all从select选项中检索数据

时间:2014-07-18 18:54:07

标签: php select preg-match option preg-match-all

<select name="address_town" id="address_town" class="locationTown">
 <option value="#ANY">Empty</option>
 <option value="438" >First</option>
 <option value="420" >Second</option>
</select>

我想检索#ANY-Empty,438-First和420-Second的数据 我写了一个代码,但我只能检索第一个数据。我想要他们所有人。 我的代码如下:

preg_match_all('/<select[^>]+?address_town[^>]+?>(.*?)<\/select>/', $open, $matches);
$options = $matches[1];
foreach ($options as $select) {
    preg_match_all('/<option value="(.*?)">(.*?)<\/option>/', $select, $matches2);
}   
print_r($matches2);

感谢您的帮助..

1 个答案:

答案 0 :(得分:2)

首先,至少在你的例子中,第一个preg_match_all是无用的。 然后获取您要求的数据只需执行此操作:

preg_match_all('/<option value="(.*?)"\s*>(.*?)<\/option>/', $html, $matches, PREG_SET_ORDER);
foreach ($matches as $val) {
    echo $val[1].'-'.$val[2];
}

请注意我添加了&#34; \ s *&#34;在值=&#34;&#34;之后因为你在某些行上有空格。

您可能需要参考手册示例以获取更多信息http://php.net/manual/en/function.preg-match-all.php

编辑: 我没有尝试运行代码,但这就是精神:

preg_match_all('/<select[^>]+?address_town[^>]+?>(.*?)<\/select>/s', $open, $matches);
$options = $matches[1];
foreach ($options as $select) {
    preg_match_all('/<option value="(.*?)"\s*>(.*?)<\/option>/', $select, $matches, PREG_SET_ORDER);
    foreach ($matches as $val) {
        echo $val[1].'-'.$val[2].'\n';
    }
}   

我在正则表达式的末尾添加了s修饰符,以便。*将接受换行符