我们有一个老旧的、成长中的项目,有几千个php文件,需要清理它。
在整个项目中,我们有很多类似的函数调用。
trans('somestring1');
trans("SomeString2");
trans('more_string',$somevar);
trans("anotherstring4",$somevar);
trans($tx_key);
trans($anotherKey,$somevar);
所有这些函数都被嵌入到代码中,代表翻译键。我想找到一种方法来提取所有出现的 "翻译键"。
PHP项目是在VS Code中,所以RegEx搜索将有助于列出结果。或者我可以用你推荐的任何其他工具来搜索整个项目
然而,我还需要将字符串 "导出 "到一个文本文件或类似的文件中。
理想的结果是。
somestring1
SomeString2
more_string
anotherstring4
$tx_key
$anotherKey
作为奖励--如果有人知道,我怎样才能得到上面的列表,包括找到结果的文件名--那就太好了!
任何帮助都将是非常感激的
更新:我想到的RegEx。
/(trans)+\([^\)]*\)(\.[^\)]*\))?/gim
列出完整的出现 - 我如何才能只得到结果的第一部分(单引号之间或双引号之间或以$开头),请看这里。regexr.com548d4
这里有一些步骤可以得到你想要的东西。 使用这个,你可以对你的搜索结果进行查找和替换!
所以你可以在适当的情况下进行顺序的regex findreplaces。 替换可以只在搜索结果编辑器中进行,完全不影响底层文件--这就是你想要的。
如果你愿意的话,你也可以让替换动作实际编辑底层文件。
提示:这种技术也可以使做查找项目的时候 a
换成 b
含有术语的文件中 c
做起来就简单多了】。]
(1)打开一个新的搜索编辑器。按Ctrl+换挡+P (该命令目前还没有绑定到键位上。)
(2) 将此regex粘贴到搜索输入框中(regex选项为 .*
选择)。)
`(.*?)(\btrans\(['"]?)([^,'")]+)(.*)` - a relatively simple regex
参见我的另一个答案,每行最多可以使用6个条目的regex。
(\s*\d+:\s)?((.*?)(\btrans\(['"]?)([^,'")]*)((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?)(.*)
(3) 你会得到一个包含搜索结果的文件列表。 现在打开一个查找小组件 换挡+F 在该查找编辑器中。
(4)将相同的regex放入该查找输入中。 选择了Regex选项。 把 $3
到替换字段。 这只在这个搜索编辑器中替换 - 非原文件 (虽然在某些情况下如果你想这样做也可以)。 Replace All
.
如果使用1-6版本的regex,用:
$1$5 $9 $13 $17 $21 $25
(5) 瞧。 现在你可以把这个搜索编辑器保存为一个文件了。
第一个答案对于每行一个想要的捕捉,就像原来的问题一样,是有效的。 但是,如果每行有两个或更多的话,这个相对简单的regex就不能用了。
下面的regex可以适用于每行最多6个条目,例如
trans('somestring1');
stuff trans("SomeString2"); some content trans("SomeString2a");more stuff [repeat, repeat]
但对于7岁以上的人来说就不一样了--你将会 请教 为的。
下面是这个过程,再加上一个转折的 使用搜索编辑器中的一个片段 而不是FindReplace。 使用代码段可以对最终结果的格式进行更多的控制。
(1) 打开一个新的搜索编辑器。按Ctrl键+换挡+P (该命令目前还没有绑定到键位上。)
(2) 将此regex粘贴到搜索输入框中(选择regex选项.*)。
`((.*?)(\btrans\(['"]?)([^,'")]*)((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?)(.*)`
(3)你会得到一个包含搜索结果的文件列表。现在,请分别选择所有的搜索结果,用 Ctrl+换挡+L.
(4) 触发该键绑定。
{
"key": "alt+i", // whatever keybinding you like
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "${TM_SELECTED_TEXT/((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*)((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?)(.*)/$4${8:+\n }$8${12:+\n }$12${16:+\n }$16${20:+\n }$20${24:+\n }$24/g}"
}
},
该片段将被应用于您搜索结果中的每个选择。 这一部分 ${8:+\n }
是一个条件,如果有一个捕获组8--这将是第二个条件,则增加一个新行和一些空格。trans(...)
在一条线上。
演示。(不幸的是,它没有正确地显示出) Ctrl+换挡+L 单独选择所有的行或 祭祀+i 片段触发器)