我正在尝试构建一个页面,当将网站URL添加到输入中时,我的php将抓取该页面并在该页面上显示每种表单的输入名称。
我已经成功完成了此操作,但是,如果页面上有多种形式,我会尝试将结果拆分以使其更易于阅读。
<form action="" method="post">
<label style="color:#000000; font-family:arial, helvetica, sans-serif; font-size:16px; display:block;">Website URL:</label><br>
<input type="text" name="website-url-value" id="website-url-value" style="border:1px solid #000;" />
<div style="display:block; clear:both; margin-bottom:20px;"></div>
<input type="submit" name="submit" value="Find forms" />
</form>
<?php
$html = file_get_contents($_POST['website-url-value']);
$website_doc = new DOMDocument();
libxml_use_internal_errors(TRUE); //disable libxml errors
if(!empty($html)){ //if any html is actually returned
$website_doc->loadHTML($html);
libxml_clear_errors(); //remove errors for bad html
$website_xpath = new DOMXPath($website_doc);
$form_total = 1; // initial form counter
//get all the form fields
$full_forms = $website_xpath->query('
//form
'); // find forms on page
$full_inputs = $website_xpath->query('
//input[@type="text"]|
//input[@type="radio"]|
//input[@type="checkbox"]|
//input[@type="tel"]|
//input[@type="email"]|
//input[@type="date"]|
//input[@type="number"]|
//input[@type="time"]|
//textarea|
//select'
); // find form fields with these types
if($full_inputs->length > 0){
foreach($full_inputs as $single_input){
echo $single_input->getAttribute('name') . '<br />'; // show each field followed by new line
}
}
if($full_forms->length > 0){
foreach($full_forms as $single_form){
echo '<strong>' . $single_form->nodeName . " " . $form_total++ . '</strong><br />'; // show form plus count
}
}
}
?>
我希望结果看起来像: 表格1: 名字 姓 电子邮件
表格2: 名字 姓 电话
但是目前我得到的结果如下:
名字 姓 电子邮件 名字 姓 电话 表格1: 表格2:
答案 0 :(得分:1)
您正在做的是从html文档中获取所有输入,您需要做的是一次获取一张表格并获取其相关输入。
另一件事是xpath结果返回了节点列表,但是我们可以使用该节点列表并将其再次转换为xpath以便进一步查询。为此,您可以使用descendant
参数并将节点列表作为第二个参数传递。
尝试一下:
if(!empty($html)) {
$website_doc = new DOMDocument();
libxml_use_internal_errors(TRUE); //disable libxml errors
$website_doc->loadHTML($html);
libxml_clear_errors(); //remove errors for bad html
$xpath = new DOMXPath($website_doc);
$forms = $xpath->query("//form");
foreach($forms as $key => $form) {
$inputs = $xpath->query('descendant::
input[@type="text"]|
input[@type="radio"]|
input[@type="checkbox"]|
input[@type="tel"]|
input[@type="email"]|
input[@type="date"]|
input[@type="number"]|
input[@type="time"]|
textarea|
select', $form);
echo "Form ".($key+1)." <br>";
foreach ($inputs as $input) {
echo $input->getAttribute('name') . '<br />';
}
echo "<br>";
}
}