这是我第二次(在很长一段时间内)曾经接触过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;只是让我预览和打印将要更改的内容,所以我把它拿出来了,但没有任何区别。
答案 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);
}