替换类中的所有出现的$符号和sublime文本中的第一个函数

时间:2018-01-29 17:55:22

标签: php regex sublimetext3

在PHP7中阅读了var后我犯了一个非常愚蠢的错误,我错误地认为我不需要varpublic来声明类中的变量(在它的方法之外)。所以我从400多个文件中删除了它,并对几乎所有文件进行了一些重构。所以我不能回复,因为这会让我有更多的工作。

现在我遇到致命错误,我需要将privatepublic添加到以此方式声明的所有变量。我不确定这些类中是否有任何实际需要公共变量,可能private就足够了。

但是我无法弄清楚它是否可以在Sublime Text 3中完成。我尝试了许多不同的正则表达式组合,但它们都没有奏效。我猜测我可能需要一个脚本来运行所有文件,但也许我忽略了一些东西......

所以我有这样的事情:

class MyClass {
    $myvar1;
    $myvar2;

    function __construct($myvar1 = NULL, $myvar2 = array()) {
        $this->myvar1 = $myvar1;    
        $this->myvar2 = $myvar2;    
    }
}

我想把它变成这个:

class MyClass {
    private $myvar1;
    private $myvar2;

    function __construct($myvar1 = NULL, $myvar2 = array()) {
        $this->myvar1 = $myvar1;    
        $this->myvar2 = $myvar2;    
    }
}

编辑:请注意,类声明及其第一个函数之间没有注释(C / C ++和#style)。也不应考虑字符串表示法。解决方案应该具体解决这个问题,因为似乎不可能使所有可能的情况普遍适用。似乎使用\G修饰符是以我想要的方式解决这个特定问题的关键。所以请谨慎使用答案。

我认为我需要在$和第一次出现private $之间用class替换所有出现的function。是否可以使用Sublime Text 3?

到目前为止,我甚至无法找到以class开头且以第一个function结尾的模式的所有出现。目前,我正在尝试改进以下正则表达式:(?s)class (.*?){.+function。由于某种原因,选择结束于最后一个功能,而不是第一个功能,我无法弄清楚如何解决这个问题。作为最糟糕的选择,我可以使用这种模式搜索所有400多个文件,然后手动编辑它们,但这当然是一种痛苦......

PS:如果我用__construct方法分配它们,那么在那里声明它们是一个好习惯吗?

2 个答案:

答案 0 :(得分:3)

以下正则表达式只会在课程开始后匹配变量,并且在评论或常量声明后不起作用。 See regex in use here

(?:\bclass \w+\s*{\s*|\G(?!\A)\s*)\K(\$\w+\s*(?:;|=.*;))

对于适用于注释和常量的正则表达式,您可以使用以下(see regex in use here)。请注意,这再次仅适用于类顶部的变量:

(?:\bclass \w+\s*{\s*|\G(?!\A)\s*(?:(?://|#).*$|/\*[\s\S]*?\*/|\bconst[^;]*;)\s*)\K(\$\w+\s*(?:;|=.*;))

如果变量是在类的顶部之后声明的,那么快速和脏解决方案的最佳选择是使用空格作为指示属于该类的内容以及什么不是什么?吨。假设您使用了1个制表符或4个空格字符的正确缩进,则可以使用^(?:\t| {4})\K(\$\w+)

替换:private $1

  • (?:\bclass \w+\s*{\s*|\G(?!\A)\s*)匹配以下任一项:
    • \bclass \w+\s*{\s*
      • \b断言位置为单词边界
      • class按字面意思匹配
      • \w+匹配一个或多个单词字符
      • \s*{\s*匹配任意数量的空格,后跟{,后跟任意数量的空格
    • \G(?!\A)\s*在上一场比赛结束时断言位置并匹配任意数量的空白
  • \K重置报告的匹配的起点。最终匹配中不再包含任何以前消费的字符
  • (\$\w+\s*(?:;|=.*;))将以下内容捕获到捕获组1中
    • \$\w+\s*按字面匹配$,然后是一个或多个单词字符,然后是任意数量的空白
    • (?:;|=.*;)匹配;=后跟任意字符,然后;

答案 1 :(得分:3)

虽然接受的答案可能符合OP的需要,但它有很多陷阱。如果属性具有注释,或者类扩展另一个类或实现接口,或者属性之间定义了常量或者存在逗号分隔的声明,则它不起作用。

您可能会发现此正则表达式更准确(但不是防弹):

(?m)function(*COMMIT)(*F)|^\s*\K\$\S+\s*[=;,]

private $0作为替换字符串。