如何在两个HTML注释之间获取文件内容并将其替换为另一个文件中的内容?

时间:2015-11-13 20:32:16

标签: php

这是我第二次(在很长一段时间内)曾经接触过php。我试图将两个HTML注释之间的文件内容替换为位于同一目录中的另一个文件中的内容。

现在,我只是用一行($ newCode)替换两个HTML注释之间的内容进行测试。

但是,当我运行以下代码时,它希望用每行上的$ newCode行替换整个文件:

#!/bin/php
<?php
        // Testing preg_replace() with string
        $tagBegin = '<!-- test4 Begin ColdFusion Template Html_Head -->';
        $tagEnd = '<!-- test4 End ColdFusion Template Html_Head -->';

        $tagSearch = '/[^'. $tagBegin .'](.*)[^'. $tagEnd .']/';
        $strReplace = 'Testing php code';

        $testString = '<!-- test4 Begin ColdFusion Template Html_Head -->I should be gone.<!-- test4 End ColdFusion Template Html_Head -->';

        // Replaces everything between the two tags with the cfReplace code     - THIS WORKS
        // echo "Testing string replace...";
        // echo preg_replace( $tagSearch, $strRieplace, $testString );
        // echo ( "\r\n" .$testString );

        // Testing replace on ./testAaron.htm   - THIS DOES NOT WORK
        echo "\r\n Testing file replace...";
        $testFile = 'testAaron.htm';
        $newCode = 'Replaced <html> and all Header info!!!';            // to be replaced with cf code
        echo preg_replace( $tagSearch, $newCode, file_get_contents( $testFile ) );      

?>

我感觉它是file_get_contents()函数的最后一个参数中的preg_replace(),但我不知道为什么。

当我取出file_get_contents()并且只放置$testFile时,脚本只运行了一行而没有其余的testAaron.htm代码。

当我打开testAaron.htm文件时,根本没有任何更改。

我想也许可以回声&#39;只是让我预览和打印将要更改的内容,所以我把它拿出来了,但没有任何区别。

2 个答案:

答案 0 :(得分:0)

您的RegEx绝对不正确。看看它评估的内容:

/[^<!-- test4 Begin ColdFusion Template Html_Head -->](.*)[^<!-- test4 End ColdFusion Template Html_Head -->]/

这是错的; RegEx中的括号表示字符集,而不是文字字符串。此外,添加插入符^符号会使字符集无效,这意味着“没有这些字符”。

如果要搜索文字,只需使用这些字符:

$tagSearch = '/'. $tagBegin .'(.*)'. $tagEnd .'/';

此外,我会通过添加来使通配符变得懒惰,因此它不会与您代码中的其他代码匹配:

$tagSearch = '/'. $tagBegin .'(.*?)'. $tagEnd .'/';

最后,听起来你正在尝试实际修改文件本身。为此,您需要将修改后的数据写回文件。更改内存中的数据不会自动将这些更改保存到磁盘上的文件中。

答案 1 :(得分:0)

尝试此功能

echo replace_between($tagSearch, $tagBegin, $tagEnd, file_get_contents( $testFile ));

function replace_between($str, $needle_start, $needle_end, $replacement) {
    $pos = strpos($str, $needle_start);
    $start = $pos === false ? 0 : $pos + strlen($needle_start);

    $pos = strpos($str, $needle_end, $start);
    $end = $pos === false ? strlen($str) : $pos;

    return substr_replace($str, $replacement, $start, $end - $start);
}