Php 如何从窗体上的隐藏字段中提取值
我有一个表单(在我自己的blog/cms上安装,我想玩一下),里面有我想提取的隐藏值。问题是该页面上有两个表单,每个表单都有一个带值的隐藏字段。每个表单上的字段名称相同,只有隐藏值不同。大概是这样的:Php 如何从窗体上的隐藏字段中提取值,php,curl,libcurl,screen-scraping,Php,Curl,Libcurl,Screen Scraping,我有一个表单(在我自己的blog/cms上安装,我想玩一下),里面有我想提取的隐藏值。问题是该页面上有两个表单,每个表单都有一个带值的隐藏字段。每个表单上的字段名称相同,只有隐藏值不同。大概是这样的: <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/> mywordshere <input type="hidden" id="_hiddenname" name="_hidde
<input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>
mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>
两者在html源代码中看起来相同。所以,为了帮助我自己,我用这个页面打开了php文件,编辑了它,并在我需要的字段前添加了一些随机词。现在有一个字段(我不想要的字段)与上面的代码类似,但我需要的字段如下所示:
<input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>
mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>
mywordshere
如果我的页面的html源代码是php变量(用libcurl抓取的),如何从我需要的字段中提取值(在代码之前使用mywordshere)?该值将在
$\u GET[“\u hiddenname”]
或$\u POST[“\u hiddenname”]
中提供,具体取决于您使用的方法。您得到哪一个将取决于提交的表单
如果在同一表单中有两个名称相同的字段,则会出现更大的问题。该值将在
$\u GET[“\u hiddenname”]
或$\u POST[“\u hiddenname”]
中可用,具体取决于您使用的方法。您得到哪一个将取决于提交的表单
如果在同一表单中有两个字段的名称相同,则问题更大。假设这两个表单的名称不同,对吗?因此,如果您使用DOM感知的内容解析刮取的文本,您应该能够通过在其父表单中搜索来选择输入字段。假设这两种表单具有不同的名称,对吗?因此,如果您使用DOM感知的内容解析刮取的文本,您应该能够通过在其父表单中搜索来选择输入字段。使用
注意:您的HTML字符串必须定义一个DOCTYPE才能使用
注意:HTML字符串必须定义一个DOCTYPE才能工作。两个输入字段的名称相同,id相同,这才是真正的问题。HTML元素的
id
属性在给定的页面上应该是唯一的,如果是唯一的,您可以使用。例如:
$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];
}
}
$str='mywordshere';
$pos=strpos($str,'mywordshere');
如果($pos!==false){
$valuePos=strpos($str,'value=',$pos);
如果($valuePos!==false){
//获取从字符串的“value=”部分开始的文本
$str=substr($str,$valuePos);
$arr=爆炸(“”,$str);
//价值单位为$arr[1]
echo$arr[1];
}
}
但是,我强烈建议您重新使用元素id,并使用DOM方法。事实上,您有两个名为相同且id相同的输入字段,这才是真正的问题。HTML元素的
id
属性在给定页面上应该是唯一的,如果是唯一的,您可以通过一个示例轻松做到这一点。例如:
$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];
}
}
$str='mywordshere';
$pos=strpos($str,'mywordshere');
如果($pos!==false){
$valuePos=strpos($str,'value=',$pos);
如果($valuePos!==false){
//获取从字符串的“value=”部分开始的文本
$str=substr($str,$valuePos);
$arr=爆炸(“”,$str);
//价值单位为$arr[1]
echo$arr[1];
}
}
但是,我强烈建议您重新使用元素ID,并使用DOM方法。如果提交了页面,则为true,但海报询问如何从页面刮片中识别字段。如果提交了页面,则为true,但海报询问如何从页面刮片中识别字段。我无法重新编写,我使用的是wordpress,它不是我的自定义cms或类似的东西,通常是dom或php安装,或者我需要启用它?它是php核心的一部分,但取决于您的安装。如果未启用,则需要确保已安装php5 xml(对于基于rpm的软件包),或者使用--enable dom标志重新编译。你可以通过检查
phpinfo()
的输出,或者get_loaded_extensions()
,或者从命令行运行php-m
来判断是否安装了它。我不能返工它,我使用的是wordpress,它不是我的自定义cms或者类似的东西,通常是dom或php安装,或者我需要启用它?它是php核心的一部分,但这取决于你的安装。如果未启用,则需要确保已安装php5 xml(对于基于rpm的软件包),或者使用--enable dom标志重新编译。您可以通过检查phpinfo()
的输出,或get\u loaded\u extensions()
,或从命令行运行php-m
来判断它是否已安装。