2

我正在尝试制作一个插入 PHP 样板类的 Sublime Text-snippet,如下所示:

<?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. 将所有剩余的斜杠翻转为反斜杠。

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

是我在这个主题上找到的最相关的线程,但它超出了我的想象,我什至无法让它工作。

谁能帮我这个?

4

2 回答 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;

于 2014-06-10T14:19:38.380 回答
0

我确实设法让它工作,但遗憾的是它仅限于指定数量的命名空间级别。由于我当前的项目总是有 2 个级别 ( Project\Namespace),所以它现在运行良好。但这不是最佳解决方案。

这是正则表达式:

(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)
  1. 非捕获选择所有内容src/
  2. 选择下一步/。(“命名空间”)
  3. 再次执行第 2 步。(“子命名空间”)
  4. 文件名的非捕获选择

然后我用 替换$1\\$2,这将第 2 步和第 3 步中的捕获与反斜杠放在一起。

完整的片段就绪版本是:

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

这将输出Namespace\Subnamespace.

它现在可以工作,但我非常希望看到一个适用于任意数量的命名空间级别的版本。

于 2013-09-29T08:12:15.583 回答