将外部网站的`option`和`select`添加到我的网站

时间:2014-01-26 17:19:59

标签: php launchpad

我正在尝试从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>

1 个答案:

答案 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;