我正在尝试使用一些正则表达式来解析一个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);
知道怎么做?
答案 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);