PHP Laravel中如何使用正则在指定代码块内插入新行?
Laravel路由文件指定位置插入内容的正则方案
核心正则写法
针对你给出的admin前缀路由组场景,推荐使用以下正则,配合PHP的preg_replace即可实现插入需求:
/Route::group\(\["prefix" => "admin"\], function\(\)\{(.*?)(?=\n\}\);/sU
正则说明:
- 开头部分精确匹配你目标路由组的定义语句,所有正则特殊字符(
[/]/(/{等)都做了转义处理 - 修饰符
s(DOTALL)让.可以匹配换行符,支持跨行捕获路由组内的内容 - 修饰符
U开启非贪婪匹配,避免把后续其他路由组的闭合符号误匹配进来 (?=\n\}\);是正向预查,只定位到路由组闭合});之前的位置,不会破坏原有路由组的闭合结构
实际使用示例
假设你要插入一条新的dashboard路由,完整的PHP实现代码如下:
// 读取路由文件内容 $routePath = base_path('routes/web.php'); $routeContent = file_get_contents($routePath); // 要插入的新路由代码 $newRoute = " Route::get('dashboard', [AdminController::class, 'dashboard']);\n"; // 执行替换插入 $updatedContent = preg_replace( '/Route::group\(\["prefix" => "admin"\], function\(\)\{(.*?)(?=\n\}\);/sU', "Route::group([\"prefix\" => \"admin\"], function(){\$1\n$newRoute", $routeContent ); // 写回文件 file_put_contents($routePath, $updatedContent);
更稳妥的替代方案
如果你的路由组定义可能会调整(比如新增middleware参数、调整参数顺序),正则匹配容易失效,更推荐提前在目标路由组里加一个固定的注释占位符:
Route::group(["prefix" => "admin"], function(){ Route::resource("users", UserController::class); // ADMIN_ROUTE_INSERT_POINT });
此时直接匹配这个占位符即可,正则更简单容错率更高:
/\/\/ ADMIN_ROUTE_INSERT_POINT/
替换的时候把占位符和新路由一起写入,下次执行依然可以匹配到占位符位置:
$updatedContent = preg_replace( '/\/\/ ADMIN_ROUTE_INSERT_POINT/', "// ADMIN_ROUTE_INSERT_POINT\n$newRoute", $routeContent );
内容的提问来源于stack exchange,提问作者Shoaib Khan
相关产品推荐
相关产品推荐

