【问题标题】:PHP Search and Replace on page页面上的 PHP 搜索和替换
【发布时间】:2011-04-23 19:17:17
【问题描述】:

我正在尝试找到一种方法来搜索 php 中的页面以替换表单元素的名称。

我想我应该解释一下。我正在为一个朋友做一份工作,我想制作一个简单的数据库更新器,它功能强大,可以承受添加元素,而无需该人对 php 或数据库了解太多。

简而言之,我想通过一个表单搜索并将所有 name="%name%" 替换为各自的数据库表键名,这样我就可以使用一个简单的 foreach 方法来更新表。

所以我正在查看 DOMDocument 元素以打开一个 html 页面并用相应的表键按顺序替换其中的每个表单名称,但我不确定是否可以使用 loadHTMLfile 打开一个 php 页面。而且,如果我可以打开一个 php 页面,打开本身会导致无限循环吗?还是它只是像在查看客户端 html 一样解析 html?

有什么方法可以做我想做的事吗?如果不是,那没关系,我只是让它不那么棒,但我只是想知道。

【问题讨论】:

  • IDE 中的项目级搜索和替换有什么问题?
  • 嗯,这很好,但这根本不是我想要实现的目标......我希望有人能够进来,他们不知道他们在做什么能够添加一个表单元素并将名称设置为 %name% ,然后 php 脚本会自动将 %name% 值替换为数据库中适当的键名,以便它能够在我的 foreach 中轻松翻译名称表更新器,以便它在未来变得强大。所以,我想要一个服务器级别的解决方案,而不是开发人员级别的解决方案。我不会一直更新网站。我也不想。

标签: php preg-replace domdocument


【解决方案1】:

这是完全可行的。

DOMDocument 可能是完成此任务的理想(本机)工具,但您可能希望研究 DOMDocument::loadHTML() 方法而不是 loadHTMLfile() 方法。

要将处理后的 PHP 页面转换为字符串,您可以使用 CURLfile_get_contents() 或类似替代方式请求页面。这涉及发出额外的请求并添加特定的控制逻辑以避免死循环。

更好的选择可能是使用output buffering,这是我手头的一个简单示例,说明如何替换<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() 调用必须在任何标题/内容发送到浏览器之前存在,这包括会话 cookie 等。

这应该可以帮助您继续前进,如果您需要更多帮助,请告诉我。


一个通用的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
}

?>

【讨论】:

  • 非常感谢您的好评。我正在研究 DOMDocument::loadhtml() 方法和 savehtml 方法,以及 removechild 和 addchild 方法。我只是不确定如何避免我意识到可能会发生的无限循环。你能指出我正确的方向以避免这种情况吗?非常感谢!
  • @Ryan:如果您使用输出缓冲,则不需要发出新请求,因此永远不会发生无限循环,我将在几秒钟内发布一个适用于 DOMDocument 的通用示例。跨度>
  • 是的,我刚刚去阅读了您在此处链接的 ob 文档。这是我正在考虑的一种更简单的解决方案!
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2011-08-18
  • 2020-07-20
  • 2011-04-23
  • 2016-06-03
相关资源
最近更新 更多