我有形式(在我自己的博客/ cms安装,我想要玩一点)与我想要提取的隐藏值。问题是该页面上有两个表单,每个表单都带有值的隐藏字段。在每个表单上,字段名称相同,只有隐藏值不同。像这样:
<input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>
在html源代码中看起来都一样。所以,为了帮助自己我用这个页面打开php文件,编辑它并在我需要的字段之前添加一些随机单词。所以现在一个字段(我不想想要的字段)就像上面的代码一样,但我需要的字段是这样的:
mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>
我如何从我需要的字段中提取值(在代码之前使用mywordshere)如果我的页面的html源代码在php变量中(用libcurl抓取)?
答案 0 :(得分:2)
<?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才能生效。
答案 1 :(得分:1)
该值将在$_GET["_hiddenname"]
或$_POST["_hiddenname"]
中提供,具体取决于您使用的方法。你得到哪一个将取决于提交的形式。
如果您有两个字段在中以相同的形式命名为相同的,则会出现更大的问题。
答案 2 :(得分:1)
可能这两种形式有不同的名称,对吗?因此,如果您使用DOM识别的东西解析已删除的文本,您应该能够通过在其父表单中搜索输入字段来选择输入字段。
答案 3 :(得分:0)
事实上,您有两个名为相同且具有相同ID的输入字段是真正的问题。 HTML元素的id
属性在给定页面上应该是唯一的,如果是,您可以使用DOM parser轻松完成此操作。例如:
$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方法。