Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从窗体上的隐藏字段中提取值_Php_Curl_Libcurl_Screen Scraping - Fatal编程技术网

Php 如何从窗体上的隐藏字段中提取值

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

我有一个表单(在我自己的blog/cms上安装,我想玩一下),里面有我想提取的隐藏值。问题是该页面上有两个表单,每个表单都有一个带值的隐藏字段。每个表单上的字段名称相同,只有隐藏值不同。大概是这样的:

<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
来判断它是否已安装。