代码之家  ›  专栏  ›  技术社区  ›  Paul Allsopp

Regex替换PHP类中的函数名

  •  0
  • Paul Allsopp  · 技术社区  · 7 年前

    我正在将PHP5应用程序转换为PHP7,其中一个要求是删除与类同名的构造函数的所有实例,并将其命名为“\uu construct”。

    例如:

    class xyz {
        public function xyz() {
    

    需要成为

    class xyz {
        public function __construct() {
    

    我认为将egrep管道连接到sed可能是“整体”执行此操作的最佳方式,但我对这两种方法都不太清楚,无法做到这一点。

    我知道我可以使用:

    class\s+([A-Za-z]+)\s+\{
    

    获取类的名称,但我不确定从那里可以得到什么。

    非常感谢您的帮助。

    :)

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jan    7 年前

    如评论中所述,最好使用脚本语言、一些逻辑和双因素方法:

    1. 使用递归方法将包含类名的类作为“整体”进行匹配
    2. 用类名替换函数 __construct


    在里面 PHP :
    <?php
    
    $class_regex = '~
            ^\s*class\s+
            (?P<class>\S+)[^{}]+(\{
            (?:[^{}]*|(?2))*
            \})~mx';
    
    $data = preg_replace_callback($class_regex, 
        function($match) {
            $function_regex = '~function\s+\K'.$match['class'].'~';
            return preg_replace($function_regex, '__construct', $match[0]);
        },
        $data);
    
    echo $data;
    ?>
    

    在上查看外部正则表达式的演示 regex101.com 总的来说 code on ideone.com