使用PHP和RegEx从站点的源代码中获取所有选项值

时间:2010-11-23 09:20:09

标签: php mysql regex web-crawler

我正在学习RegEx和网站抓取,并提出以下问题,如果得到解答,应该会大大加快我的学习进度。

我以htmlencoded格式从网站上获取了表单元素。也就是说,我有$ content字符串,所有标签都是完整的,如下所示:

$content = "<form name="sth" action="">
<select name="city">
<option value="one">One town</option>
<option value="two">Another town</option>
<option value="three">Yet Another town</option>
...
</select>
</form>

我想以这种方式获取网站上的所有选项:

array("One Town" => "one", "Another Town" => "two", "Yet Another Town" => "three" ...);

现在,我知道这可以很容易地通过操纵字符串,切割它,切割它,搜索每个字符串中的子串,等等,直到我拥有我需要的一切。但我确信必须有一种更简单的方法来使用正则表达式,它应该立即从给定的字符串中获取所有结果。任何人都可以帮我找到一个快捷方式吗?我搜索过网络上最好的正则表达式网站,但无济于事。

非常感谢

5 个答案:

答案 0 :(得分:6)

Best methods to parse HTML。找到下面的DOM解决方案:

$dom = new DOMDocument;
$dom->loadHTMLFile('http://example.com');
$options = array();
foreach($dom->getElementsByTagName('option') as $option) {
    $options[$option->nodeValue] = $option->getAttribute('value');
}

这也是can be done with Regex,但是当有很多本地和第三方解析器可供PHP使用时,我觉得用Regex编写一个可靠的HTML解析器是不切实际的。

答案 1 :(得分:0)

如果它是真正连贯的HTML,那么一个简单的正则表达式将会:

 preg_match('/<option\s+value="([^">]+)">([^<]+)/i', ...

然而,使用phpQuery或QueryPath通常更简单,更可靠。

 $options = qp($html)->find("select[name=city]")->find("option");
 foreach ($options as $o) {
      $result[ $o->attr("value") ] = $o->text();
 }

答案 2 :(得分:0)

使用SimpleXML:

libxml_use_internal_errors(true);
$load = simplexml_load_string($content);
foreach ($load->xpath('//select/option') as $path)
    var_dump((string)$path[0]);

答案 3 :(得分:0)

我认为使用DomXPath会更容易,而不是使用正则表达式。 你可以尝试这样的事情(未经测试,可能需要一些调整)......

<?php
$content = '<form name="sth" action="">
            <select name="city">
            <option value="one">One town</option>
            <option value="two">Another town</option>
            <option value="three">Yet Another town</option>
            </select>
            </form>';

$doc = new DOMDocument;
$doc->loadhtml($content);
$xpath = new DOMXPath($doc);
$options = $xpath->evaluate("/html/body//option");
for ($i = 0; $i < $options->length; $i++) {
        $option = $options->item($i);
        $values[] =  $option->getAttribute('value');                
}
var_dump($values);
?>

答案 4 :(得分:0)

<?php

$content = '<form name="sth" action="">
<select name="city">
<option value="one">One town</option>
<option value="two">Another town</option>
<option value="three">Yet Another town</option>
</select>
</form>';

preg_match_all('@<option value=\"(.*)\">(.*)</option>@', $content,$matches);

echo "<pre>";
print_r($matches);
?>

现在$ matches包含您正在寻找的数组,您可以非常轻松地将它们处理成结果。