如何替换PHP文件中的最后一个花括号

时间:2012-03-31 03:55:30

标签: php regex preg-replace

我正在尝试使用一些正则表达式来解析一个PHP代码,我坚持如何使用preg_replace()用我想要的字符串替换最后一个}。这是一个示例代码:

$data = '<?php

 class Myclass {
      function index() {

      }
 } // <- I want to replace that curly brace

?>';

  $data = preg_replace('##is','// my new string here',$data);

知道怎么做?

4 个答案:

答案 0 :(得分:5)

找到最后一个花括号并用字符串

替换后面的所有字符

使用搜索模式:"(\})[^\}]*$"应该这样做:

$pattern = "(\})[^\}]*$";
preg_replace($pattern, $replaceWith, $subject);

找到最后一个大括号,只用一个字符串

替换大括号本身

使用negative lookahead,例如:\}(?!.*\})

更多信息:http://frightanic.wordpress.com/2007/06/08/regex-match-last-occurrence/

答案 1 :(得分:2)

使用{查找上一个strpos的位置,然后使用substr_replace

答案 2 :(得分:1)

您还可以尝试:\}(?!.*\})

答案 3 :(得分:0)

@Noufal Ibrahim提出了一个更好的解决方案。我编写了一个实现此解决方案的函数。

function _injectCodeInClassDefinition($classString, $newCode, $comment="automatic patcher") {
    $replaceWith = "// BEGIN code injected by $comment\n$newCode\n// END code injected by $comment\n";
    $pos = strrpos($classString, '}');
    return substr_replace($classString, $replaceWith, $pos, 0);
}

示例用法(向类文件添加新函数)

$filePath = '/webroot/app/code/local/VendorX/ModuleY/controllers/Adminhtml/IndexController.php';

$newClassCode = _injectCodeInClassDefinition(
    file_get_contents($filePath),
    "\tprotected function _isAllowed() { return true; } // ToDo: Fix this to actually check the ACL",
    "SUPEE-6285 compatability fix"
);

file_put_contents($filePath, $newClassCode);