我正在尝试从ppa添加option
标记,以便在我自己的网站上显示当前支持的Ubuntu发行版。
这是我到目前为止所拥有的。
<?php include 'https://launchpad.net/~gregory-hainaut/+archive/pcsx2.official.ppa#field.series'; ?>
这是option
标记的内容:
<select onchange="updateSeries(this);" size="1" name="field.series" id="field.series">
<option value="YOUR_UBUNTU_VERSION_HERE" selected="selected">Choose your Ubuntu version</option>
<option value="trusty">Trusty (14.04)</option>
<option value="saucy">Saucy (13.10)</option>
<option value="raring">Raring (13.04)</option>
<option value="quantal">Quantal (12.10)</option>
<option value="precise">Precise (12.04)</option>
<option value="lucid">Lucid (10.04)</option>
</select>
答案 0 :(得分:2)
您需要使用file_get_contents
(或curl
)来获取实际的源代码,并使用它来解析(例如)DOMDocument
。例如,您可以尝试这样的事情:
Fist定义一个函数,让我们获取节点的innerHTML(感谢Hiam):
function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child)
{
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}
然后获取内容并按ID
获取选择菜单$ppa = file_get_contents('https://launchpad.net/~gregory-hainaut/+archive/pcsx2.official.ppa#field.series');
$doc = new DomDocument;
$doc->loadHTML($ppa);
$innerHTML = DOMinnerHTML($doc->getElementById('field.series_filter'));
如果我回显$innerHTML
,结果是:
<option value="">Any series</option>
<option value="trusty">Trusty</option>
<option value="saucy">Saucy</option>
<option value="raring">Raring</option>
<option value="quantal">Quantal</option>
<option value="precise">Precise</option>
<option value="lucid">Lucid</option>
从这个结果中,您会注意到我只获得了选择菜单的内部html ,因此您需要将返回的innerHTML包装在select
标记中:
<select name='[your name]' [...other properties]>
<?=$innerHTML;?>
</select>
OP在评论中提到一切正常,但他想要一个与上面选择的菜单不同的选择菜单。由于他正在抓取的页面具有无效标记(两个单独的select
菜单具有相同的id
),因此DOMDocument
getElementById
调用未获取正确的节点。要纠正这个问题,你必须查看DOM树并精确一个唯一的父元素,这样你就可以先获取父节点,然后然后运行一个查询来查找你要查找的项目在这种情况下,OP想要的菜单位于ID为“”的div
内,所以我们只需抓住该节点,然后使用getElementsByTagName
抓取选择菜单:
//... get the code (set in $ppa) as per the original section
$doc->loadHTML($ppa);
//Grab the parent div because it has a unique ID
$parent_div = $doc->getElementById('series-widget-div');
//then seach for all <select> tags and grab the first one
$select_menu = $parent_div->getElementsByTagName('select')->item(0);
//... and now we're ready to get the innerHTML
$innerHTML = DOMinnerHTML( $select_menu );
//echo it out!
echo $innerHTML;