Как разделить результаты запроса php xpath - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь создать страницу, чтобы при добавлении 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:

1 Ответ

1 голос
/ 25 июня 2019

Что вы делаете, так это получаете все входные данные из 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>";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...