用PHP替换PHP / HTML文件的HTML元素内容

时间:2014-08-14 11:12:12

标签: php html replace

问题

我正在尝试使用PHP编辑HTML / PHP文件服务器端。使用AJAX Post,我向服务器发送三个不同的值:

  • 需要修改的网页的url
  • 需要编辑的元素的id
  • 元素的新内容

我现在的PHP文件如下所示:

<?php
    $data = json_decode(stripslashes($_POST['data']));
    $count = 0;
    foreach ($data as $i => $array) {
        if (!is_array($array) && $count == 0){
            $count = 1;
            // $array = file url
        }
        elseif (is_array($array)) {
            foreach($array as $i => $content){
                // $array[0] = id's
                // $array[1] = contents
            }
        }
    }
?>

正如您所看到的,我将变量包装在一个数组中,因此可以一次编辑多个元素。 我一直在寻找解决方案几个小时,但无法下定决心,并告诉我们什么是最佳/可能的解决方案。

解决方案

我尝试创建一个新的DOMElement并在html中加载,但在处理PHP文件时,这个解决方案是不可能的,因为它无法保存php文件:

$html = new DOMDocument(); 
$html->loadHTMLFile('file.php'); 
$html->getElementById('myId')->nodeValue = 'New value';
$html->saveHTMLFile("foo.html");

(来自this回答)

打开文件,写入文件并保存文件是另一种方法。但我想我必须以这种方式使用str_replacepreg_replace

$fname = "demo.txt";
$fhandle = fopen($fname,"r");
$content = fread($fhandle,filesize($fname));

$content = str_replace("oldword", "newword", $content);

$fhandle = fopen($fname,"w");
fwrite($fhandle,$content);
fclose($fhandle);

(来自this页)

我到处都读到str_replacepreg_replace有风险'因为我正在尝试编辑各种DOM元素,而不是特定的字符串/元素。我想下面的代码接近我想要实现的目标,但我真的不相信它..

$replace_with = 'id="myID">' . $replacement_content . '</';
if ($updated = preg_replace('#id="myID">.*?</#Umsi', $replace_with, $file)) {   
    // write the contents of $file back to index.php, and then refresh the page.
    file_put_contents('file.php', $updated);
}

(来自this回答)

问题

简而言之:什么是最佳解决方案,或者甚至可以仅提供id来编辑不同文件类型的HTML元素内容?

许愿步骤:

  • url

  • 获取文件
  • 使用id

  • 查找元素
  • 替换它的内容

1 个答案:

答案 0 :(得分:1)

首先,你不想使用正则表达式函数进行HTML解析。请参阅答案here

我将在假设您致力于在解释之前在服务器端检索PHP文件的假设下回答这个问题。您的方法现在存在问题,因为您似乎认为您可以通过URL参数检索源PHP文件 - 但这是结果的位置(解释为PHP)。所以要小心你的结构能做你想做的事。

我假设PHP文件的结构如下:

<?php include_some_header(); ?>
    <tag>...</tag>
    <!-- some HTML -->
<?php //some code ?>
    <tag>...</tag>
    <!-- some more HTML -->
<?php //some code ?>

您现在的问题是您无法使用HTML阅读器(和编写器),因为您的文件不是HTML。我的答案是你应该重构代码,将模板语言与业务逻辑分开。开始使用templating language。之后,您将能够在没有代码的情况下打开模板,并使用DOM解析器和编写器回写模板。

您当前设置中唯一的替代方法是使用this answer中找到的替换功能。它很丑。它可能会破裂。但这绝对不是不可能的。 在使用您自己的代码编写自己的代码之前进行备份