php - 用于删除整个目录中起始字符和结束字符之间的所有文本的 Shell 脚本或命令
问题描述
寻找一种简单的方法来删除我的所有 TODO:整个脚本目录中的注释。
如果我有:
/*
TODO: Some text here
Some more Here
Some more Here
*/
我想删除 /* 介于两者之间的所有内容 */ 没什么大不了的,只是想知道减小文件大小
解决方案
这是开始的:
$file = 'somefile.php';
$f = fopen($file,'r');
$temp = dirname($file).'/temp.php';
print_r($temp);
$t = fopen($temp, 'w');
$mode = 'write';
$buffer = [];
while($line=fgets($f)){
print_r($mode."\n");
switch($mode){
case 'write':
if(preg_match('/^\s*\/\\*/', $line)){
$buffer[] = $line;
$mode = 'comment';
}else{
fputs($t,$line);
}
break;
case 'comment':
if(preg_match('/^\s*\\**\s*@TODO/i', $line)){
$buffer = [];
$mode = 'skip';
}else if(preg_match('/^\s*\\*\//', $line)){
fwrite($t,implode("", $buffer));
$buffer = [];
fputs($t,$line);
$mode = 'write';
}else{
$buffer[] = $line;
}
break;
case 'skip':
if(preg_match('/^\s*\\*\//', $line)){
$mode = 'write';
}
break;
}
}
/*
fclose($t);
fclose($f);
rename($temp, $file);
*/
我针对这个文件进行了测试
<?php
$var= "foo";
/*
@todo hello
some other shuff
*/
/**
*
* @author Me
*
*/
class someclass{
}
这是里面的东西temp.php
<?php
$var= "foo";
/**
*
* @author Me
*
*/
class someclass{
}
希望能帮助到你。在尝试此操作之前,我可能会备份您的文件。
更新
必须修复一些小问题,所以它会跳过没有@todo
. 其余的你可能很容易解决。
正则表达式仅用于解释像这样的空格或注释
/*
* @todo
*/
这\\*
变成\*
了正则表达式引擎,然后变成了文字*
。
所以这个\s*\/\\*
\s*
- 没有或更多的空间\/
- 从/
字面上看\\*
- 从*
字面上看
或者用英文/*
打开评论标签。
我提到这一点是因为正则表达式很棘手,但你可能有空格和其他东西,可能每一个@todo
都不是第一件事。
这样做,你可以自己处理每一行,它简化了事情,更重要的是提高了匹配的准确性。
推荐阅读
- xslt - 删除 xslt 中没有主体的节点
- substrate - 当事务失败时,是否可以在 Substrate UI 中读取 SRML 错误消息?
- jquery - 选择大小时添加 opacity .4 类,并且在加载函数 opacity 返回 1 后
- bash - 解析lua文件的脚本
- chef-infra - 使用 Policyfiles 和 ChefSpec 测试资源说明书
- javascript - 什么首先触发了本机反应?
- docker - 为什么 docker-compose build 不能运行命令,但 docker build 可以?
- jspdf - 使用 jspdf-autoTable 和 jspdf 复制表格的样式
- java - java - 如何在java spring mvc应用程序中防止服务器端的xss?
- javascript - 如何将 getAccessToken 与 fetch 功能集成以将数据从 DRF 后端加载到 React 前端?