PHP поиск и замена на странице - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь найти способ поиска по странице в php, чтобы заменить имена элементов формы.

Думаю, мне следует объяснить. Я делаю работу для друга, и я хочу сделать простой обновитель базы данных, который будет надежным и сможет противостоять добавлению элементов, даже если человек не знает много о php или базах данных.

Короче говоря, я хочу выполнить поиск в форме и заменить все name = "% name%" соответствующими именами ключей таблицы базы данных, чтобы я мог использовать простой метод foreach для обновления таблицы.

Поэтому я смотрел на элемент DOMDocument, чтобы открыть html-страницу и заменить каждое имя формы внутри по порядку соответствующими ключами таблицы, но я не был уверен, смогу ли я открыть страницу php с помощью loadHTMLfile или нет. И, если бы я мог открыть страницу php, вызвало бы само открытие бесконечный цикл? Или он просто проанализирует html, как если бы он смотрел на html на стороне клиента?

Есть ли способ сделать то, что я хочу? Если нет, то все в порядке, я просто сделаю это немного менее удивительным, но мне было просто интересно.

1 Ответ

3 голосов
/ 23 апреля 2011

Это прекрасно выполнимо.

DOMDocument, возможно, является идеальным (нативным) инструментом для этой задачи, но вы, вероятно, захотите взглянуть на метод DOMDocument::loadHTML() вместо loadHTMLfile().

Чтобы получить обработанную страницу PHP в строку, вы можете запросить страницу с помощью CURL , file_get_contents() или аналогичной альтернативы. Это включает в себя создание дополнительного запроса и добавление определенной логики управления, чтобы избежать бесконечного цикла.

Лучшей альтернативой может быть использование буферизации вывода , вот простой пример того, как заменить содержимое тега <title>:

<?php

ob_start();

echo '<title>Original Title</title>';

/*    get and delete current buffer      &&  start a new buffer */
if ((($html = ob_get_clean()) !== false) && (ob_start() === true))
{
    echo preg_replace('~<title>([^<]*)</title>~i', '<title>NEW TITLE</title>', $html, 1);
}

?>

Я использую preg_replace(), но у вас не должно возникнуть проблем с его адаптацией для использования DOMDocument узлов. Также стоит заметить, что вызов ob_start() должен присутствовать до того, как заголовки / содержимое будут отправлены в браузер, включая сеансовые куки и т. Д.

Это должно помочь вам, дайте мне знать, если вам понадобится дополнительная помощь.


Общий DOMDocument пример:

<?php

ob_start(); // This must be the very first thing.

echo '<html>'; // Start of HTML.
echo '...'; // Your inputs and so on.
echo '</html>'; // End of HTML.

// Final processing, the $html variable will hold all output so far.
if ((($html = ob_get_clean()) !== false) && (ob_start() === true))
{
    $dom = new DOMDocument();

    $dom->loadHTML($html); // load the output HTML

    /* your specific search and replace logic goes here */

    echo $doc->saveHTML(); // output the replaced HTML
}

?>
...