防止preg_replace将错误的整数用于捕获组

时间:2014-07-26 14:08:47

标签: php regex preg-replace

对于我正在处理的项目,我需要更改/更新PHP文件。 这个PHP文件有一个“最后编辑”部分,它应该包含文件的最后更新日期时间。

我遇到的问题是preg_replace误解了我的捕获组$1 $12 我该如何解决这个问题?

<?php
$source = <<<'SOURCE'
<?php
/* 
    bla bla bla bla

    ================================================
    - Installer for Foo v.1.00           
    ================================================
        author      :   tommy
        created at  :   26-07-2014 15:45:39
        edited by   :   tommy
        last edit   :   26-07-2014 15:54:31
        remarques   :

    ===============================================*/


# IMPORTANT : Don't change closure name  
$func = function() {
    /* -- Do stuff here -- */

};
SOURCE;

function getLoggedInUser() {
    return 'LLama';
}

function updateFileInformation($code) {
        $pattern = '#({placeholder}.+:\s+)(.+)(\n)#mi';     

        $needles = [
            str_replace('{placeholder}', 'edited by', $pattern),
            str_replace('{placeholder}', 'last edit', $pattern),
        ];      
        $replacements = [
            '$1'.getLoggedInUser().'$3',
            '$1'.date('d-m-Y H:i:s').'$3',
        ];
        return preg_replace($needles, $replacements, $code);
}

echo updateFileInformation($source);

预期输出应为:

Last edit : 26-07-2014 16:07:15

实际输出:

6-07-2014 16:07:15

Demo

1 个答案:

答案 0 :(得分:1)

只需保护替换文字中的反向引用,例如使用${1}代替$1