我正在学习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" ...);
现在,我知道这可以很容易地通过操纵字符串,切割它,切割它,搜索每个字符串中的子串,等等,直到我拥有我需要的一切。但我确信必须有一种更简单的方法来使用正则表达式,它应该立即从给定的字符串中获取所有结果。任何人都可以帮我找到一个快捷方式吗?我搜索过网络上最好的正则表达式网站,但无济于事。
非常感谢
答案 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包含您正在寻找的数组,您可以非常轻松地将它们处理成结果。