Php 填写表单字段

Php 填写表单字段,php,curl,Php,Curl,我想填写一个表单字段,然后使用CURL提交。该网页有许多表单字段已经填写,所以我不想触摸这些字段 因此,是否可以仅使用curl和fill来填写所需字段,并将其与已填写的所有其他字段一起提交?不确定是否合适,但为了检查所需字段,您需要解析HTML并检查每个输入文件,并查找任何所需的内容 要解析HTML,可以使用以下工具: 使用这些工具,您可以打开页面,在字段上查找任何必需的标记,然后决定是否使用表单字段提交。取决于表单最初的填充方式 如果预填充的元素都使用value=“foo”,则只需抓取页面

我想填写一个表单字段,然后使用CURL提交。该网页有许多表单字段已经填写,所以我不想触摸这些字段


因此,是否可以仅使用curl和fill来填写所需字段,并将其与已填写的所有其他字段一起提交?

不确定是否合适,但为了检查所需字段,您需要解析HTML并检查每个输入文件,并查找任何所需的内容

要解析HTML,可以使用以下工具:


使用这些工具,您可以打开页面,在字段上查找任何必需的标记,然后决定是否使用表单字段提交。

取决于表单最初的填充方式

如果预填充的元素都使用
value=“foo”
,则只需抓取页面(使用curl),将其加载到DOMDocument中,获取所需的
,并填充所需的字段,然后使用新的curl请求将其作为另一个请求传递(考虑表单的
操作
方法
属性,以及发送的表单数据)

但是,如果它们是用JS填充的,而您不打算编写cURL请求来模仿您在浏览器上的操作,那么我看不到一种简单的方法来模仿JS操作,然后填充,然后发送它

此外,这并不考虑可能存在的任何cookie。如果您需要这些cookie,您必须从第一个请求开始存储它们,并确保在实际提交呼叫中发送它们。

完整演练(提供HTML摘要文本) 要进行自定义,只需将字段名添加到
$fields\u i\u want
数组中,以指定要从下载的源文本中提取的所有文本字段值,并更改检索和提交位置的URL

另外,curl是
file\u get\u contents()
的更好替代方法。您可以使用上的说明了解如何通过curl检索远程文本

// First, retrieve the remote source using file_get_contents()
$str = file_get_contents('http://www.example.com/');    

$my_field_val  = 'my_field_value';
$fields_i_want = array('audien', 'unifor');
$field_vals    = array();
$field_string  = '';


// Use DOM to parse the values you want from the form
$dom = new DOMDocument;
$dom->loadHTML($str);

// Get all the input field nodes
$inputs = $dom->getElementsByTagName('input');

// Iterate over the input fields and save the values we want to an array
foreach ($inputs as $input) {
  $name = $input->getAttribute('name');
  if (in_array($name, $fields_i_want)) {
    $val = $input->getAttribute('value');
    $field_vals[$name] = $val;
  }
}

// append the field value we set ourselves to the list
$field_vals['my_field'] = $my_field_val;

foreach ($field_vals as $key => $val) {
  $field_vals[$key] = urlencode($val)
}

// url-ify the data for the POST
foreach($fields as $key=>$value) {
  $fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');

// open connection
$ch = curl_init();

// POST the data to the form submission url
$submit_url = 'http://www.submitform.com';

// set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $submit_url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

// execute post (returns TRUE on success or FALSE on failure)
$result = curl_exec($ch);

// close connection
curl_close($ch);

为了获得预先填充的字段,您首先需要检索远程页面,从检索到的文本中解析字段值,然后将这些值与最终表单提交请求合并。您是在寻求如何实现这一点的帮助,还是只想知道是否可以做到这一点?:)@罗瑞:这正是我想要的……你知道怎么做吗?是的,但这取决于远程页面HTML的确切格式。如果我要回答除取出预填充值之外的所有操作,你能从那里得到它吗?如果没有,你必须提供你需要从中获取数据的特定页面的地址。给我几分钟时间,我将把html代码上传到github并在这里发布链接。请在这里找到html:你说得对Mike,事实上,我认为他可以在很多方面完成任务,但我觉得问题还不够清楚,也许这就是他想要的。通过走查,一切都很顺利。但其中一个字段描述未被复制。你知道为什么会这样吗?这个字段中没有几行描述,也没有像
这样的符号。我只是浏览了一下html语法。它的类型是textarea,这可能是问题所在吗?有没有更好的方法不将它限制为“input”类型?$inputs=$dom->getElementsByTagName('input');你可以用和这个例子一样的方法。。。添加一行,如
$tareas=$dom->getElementsByTagName('textarea')
并可能将其结果与textarea字段名数组进行比较。尝试应用人们展示的概念,并尝试变得更聪明,而不仅仅是复制和粘贴他人的代码!:)如果你试图让它工作,并有严重的问题,让我知道。