插入 PSR-0 命名空间的 Sublime Text 片段

问题描述 投票:0回答:2

我正在尝试制作一个 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>

我已经弄清楚如何获取类名 - 但事实证明获取命名空间要困难得多。我远不是正则表达式方面的专家 - 而这个专家需要:

  1. 获得一切之后
    src/
  2. ...最后一个
    /
  3. 之前
  4. 将所有剩余的斜杠翻转为反斜杠。

/Users/Projects/Whatever/src/Namespace/Subnamespace/TestClass.php
变成
Namespace\Subnamespace

这是我在该主题上找到的最相关的线程,但它超出了我的能力范围,我什至无法让它工作。

有人可以帮我吗?

php regex namespaces code-snippets sublimetext
2个回答
2
投票
这是在 ST-3 中的 2 个以上级别上工作的名称空间替换:

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;


    


0
投票
我确实设法让它工作,但遗憾的是它仅限于指定数量的命名空间级别。由于我当前的项目始终有 2 个级别 (

Project\Namespace

),因此目前效果良好。但这不是最佳解决方案。

这是正则表达式:

(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)

    不捕获
  1. src/
     之前的所有内容的选择
    
  2. 选择下一步的所有内容
  3. /
    。 (“命名空间”)
  4. 再次执行步骤 2。 (“子命名空间”)
  5. 非捕获文件名选择
然后我用

$1\\$2

 进行替换,这会将步骤 2 和步骤 3 中的捕获内容放在中间并带有反斜杠。

完整的片段就绪版本是:

${TM_FILEPATH/(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)/$1\\$2/g}

这将输出

Namespace\Subnamespace

它目前有效,但我非常希望看到一个适用于任意数量的命名空间级别的版本。

© www.soinside.com 2019 - 2024. All rights reserved.