我正在尝试制作一个 Sublime Text 片段,插入 PHP 样板类,如下所示:
<?php
namespace Namespace\Subnamespace;
class TestClass
{
public function __construct()
{
//code...
}
}
使用PHP-FIG标准(或类似标准)时,命名空间和类名都可以从文件的路径中获取。上例中的文件将放置在
/Users/Projects/Whatever/src/Namespace/Subnamespace/TestClass.php
中。
这是我到目前为止所拥有的:
<snippet>
<content><![CDATA[
<?php
namespace ${1:Namespace};
class ${TM_FILENAME/(.*)[.](.*)/$1/g}
{
public function __construct()
{
${0://code...}
}
}
]]></content>
<tabTrigger>phpclass</tabTrigger>
<scope>text.html</scope>
</snippet>
我已经弄清楚如何获取类名 - 但事实证明获取命名空间要困难得多。我远不是正则表达式方面的专家 - 而这个专家需要:
src/
/
/Users/Projects/Whatever/src/Namespace/Subnamespace/TestClass.php
变成 Namespace\Subnamespace
。
这是我在该主题上找到的最相关的线程,但它超出了我的能力范围,我什至无法让它工作。
有人可以帮我吗?
namespace ${1:${TM_FILEPATH/(?:.*src\/)|(\/)?([^\/]+)(?=\/)|(?:\/[^\/]+\.php$)/(?1:\\$^N:$^N)/g}};
/path/to/project/src/sub1/sub2/sub3/sub4/class.php
namespace sub1\sub2\sub3\sub4;
Project\Namespace
),因此目前效果良好。但这不是最佳解决方案。这是正则表达式:
(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)
src/
之前的所有内容的选择
/
。 (“命名空间”)
$1\\$2
进行替换,这会将步骤 2 和步骤 3 中的捕获内容放在中间并带有反斜杠。完整的片段就绪版本是:
${TM_FILEPATH/(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)/$1\\$2/g}
这将输出
Namespace\Subnamespace
。它目前有效,但我非常希望看到一个适用于任意数量的命名空间级别的版本。