0

我有我想要提取的隐藏值的表单(在我自己的博客/cms 安装上,我想玩一点)。问题是该页面上有 2 个表单,每个表单都有带有值的隐藏字段。每个表单字段名称相同,只有隐藏值不同。像这样的东西:

<input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>

两者在 html 源代码中看起来相同。所以,为了帮助自己,我用这个页面打开了 php 文件,对其进行了编辑,并在我需要的字段之前添加了一些随机单词。所以现在一个字段(我想要的那个)就像上面的代码一样,但我需要的字段是这样的:

mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>

如果我在 php 变量中有我的页面的 html 源代码(用 libcurl 抓取),我如何从我需要的字段中提取值(在其代码之前使用 mywordshere)?

4

4 回答 4

2

使用DOMDocument的示例

<?php

$html = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
  <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere">
</body>
</html>
HTML;

$doc = new DOMDocument();
$doc->validateOnParse = true;
$doc->loadHTML( $html );

$node = $doc->getElementById( '_hiddenname' );
echo $node->getAttribute( 'value' );

?>

注意:您的 HTML 字符串必须定义一个 DOCTYPE 才能正常工作。

于 2009-09-08T17:39:56.670 回答
1

该值将在$_GET["_hiddenname"]或中可用$_POST["_hiddenname"],具体取决于您使用的方法。你得到哪一个将取决于哪个表单正在提交。

如果您在同一个表单中有两个名称相同的字段,那么您将遇到更大的问题。

于 2009-09-08T17:17:44.637 回答
1

假设这两种形式有不同的名称,对吗?因此,如果您使用 DOM 感知的内容解析抓取的文本,您应该能够通过在其父表单中搜索来选择您的输入字段。

于 2009-09-08T17:18:19.240 回答
1

您有两个名称相同且具有相同 ID 的输入字段这一事实是真正的问题。HTML 元素的id属性在给定页面上应该是唯一的,如果是,您可以使用DOM 解析器轻松完成此操作。例子:

$dom = new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$inputs = $dom->getElementsByTagName('input');
foreach ($inputs as $i)
{
    if ($i->getAttribute('id') == 'targetId') {
        //do some stuff
    }
} 

由于您不能采用这种方法,并且您已经用可以识别的字符串标记了您的输入,因此我将使用字符串函数的组合:

$str = 'mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>';
$pos = strpos($str,'mywordshere');
if ($pos !== false) {
    $valuePos = strpos($str,'value=',$pos);
    if ($valuePos !== false) {
        //get text starting from the 'value=' portion of the string
        $str = substr($str,$valuePos);
        $arr = explode('"',$str);
        //value will be in $arr[1]
        echo $arr[1];
    }
}

不过,我强烈建议您重新设计元素 ID,并使用 DOM 方法。

于 2009-09-08T17:42:19.177 回答