正则表达式从代码中删除方法 [英] RegEx Removing Methods from Code

查看:35
本文介绍了正则表达式从代码中删除方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用正则表达式,我试图从以下代码中删除所有方法/函数.单独留下全局范围".但是,我无法使其与方法的所有内部内容匹配.

With Regular Expressions I'm trying to remove all the methods/functions from the following code. Leaving the "global scope" alone. However, I can't manage to make it match for all the inner content of a method.

<?php
$mother = new Mother();
class Hello
{
    public function FunctionName($value="username",)
    {

    }
    public function ododeqwdo($value='')
    {
        # code...
    }
    public function ofdoeqdoq($value='')
    {
    if(isset($mother)) {
        echo $lol;
    }
    if(lol(9)) {
       echo 'lol';
    }
    }
}
function user()
{
    if(isset($mother)) {
        echo $lol;
    }
    if(lol(9)) {
       echo 'lol';
    }
}
    $mother->global();
function asodaosdo() {

}

我目前的正则表达式是:(?:(public|protected|private|static)\s+)?function\s+\w+\(.*?\)\s+{.*?} 但是,它不会选择内部有括号的方法,例如 function user().

The current Regular Expression I have is: (?:(public|protected|private|static)\s+)?function\s+\w+\(.*?\)\s+{.*?} However, it won't select a method that has brackets inside, like function user().

如果有人能指出我正确的方向.

If someone could point me in the right direction.

推荐答案

您无法使用正则表达式正确执行此操作.您需要编写一个可以正确解析注释、字符串文字和嵌套括号的解析器.

You can't do this properly with regex. You need to write a parser that can properly parse comments, string literals and nested brackets.

Regex 无法处理这些情况:

Regex cannot cope with these cases:

class Hello
{
  function foo()
  {
    echo '} <- that is not the closing bracket!';
    // and this: } bracket isn't the closing bracket either!
    /*
    } and that one isn't as well...
    */
  }
}

编辑

这里有一个关于如何使用XUE Can提到的tokenizer功能的小demo:

Here's a little demo of how to use the tokenizer function mentioned by XUE Can:

$source = <<<BLOCK
<?php

\$mother = new Mother("this function isNotAFunction(\$x=0) {} foo bar");

class Hello
{
    \$foo = 666;

    public function FunctionName(\$value="username",)
    {

    }
    private \$bar;
    private function ododeqwdo(\$value='')
    {
        # code...
    }
    protected function ofdoeqdoq    (\$value='')
    {
        if(isset(\$mother)) {
            echo \$lol . 'function() {';
        }
        if(lol(9)) {
           echo 'lol';
        }
    }
}

function user()
{
    if(isset(\$mother)) {
        echo \$lol;
    }
    /* comment inside */
    if(lol(9)) {
       echo 'lol';
    }
}
/* comment to preserve function noFunction(){} */
\$mother->global();

function asodaosdo() {

}

?>
BLOCK;

if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} 
else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}

// Tokenize the source
$tokens = token_get_all($source);

// Some flags and counters
$tFunction = false;
$functionBracketBalance = 0;
$buffer = '';

// Iterate over all tokens
foreach ($tokens as $token) {
    // Single-character tokens.
    if(is_string($token)) {
        if(!$tFunction) {
            echo $token;
        }
        if($tFunction && $token == '{') {
            // Increase the bracket-counter (not the class-brackets: `$tFunction` must be true!)
            $functionBracketBalance++;
        }
        if($tFunction && $token == '}') {
            // Decrease the bracket-counter (not the class-brackets: `$tFunction` must be true!)
            $functionBracketBalance--;
            if($functionBracketBalance == 0) {
                // If it's the closing bracket of the function, reset `$tFunction`
                $tFunction = false;
            }
        }
    } 
    // Tokens consisting of (possibly) more than one character.
    else {
        list($id, $text) = $token;
        switch ($id) {
            case T_PUBLIC:
            case T_PROTECTED:
            case T_PRIVATE: 
                // Don'timmediately echo 'public', 'protected' or 'private'
                // before we know if it's part of a variable or method.
                $buffer = "$text ";
                break; 
            case T_WHITESPACE:
                // Only display spaces if we're outside a function.
                if(!$tFunction) echo $text;
                break;
            case T_FUNCTION:
                // If we encounter the keyword 'function', flip the `tFunction` flag to 
                // true and reset the `buffer` 
                $tFunction = true;
                $buffer = '';
                break;
            default:
                // Echo all other tokens if we're not in a function and prepend a possible 
                // 'public', 'protected' or 'private' previously put in the `buffer`.
                if(!$tFunction) {
                    echo "$buffer$text";
                    $buffer = '';
                }
       }
   }
}

将打印:

<?php

$mother = new Mother("this function isNotAFunction($x=0) {} foo bar");

class Hello
{
    $foo = 666;


     private $bar;


}


/* comment to preserve function noFunction(){} */
$mother->global();



?>

这是原始来源,只有没有功能.

which is the original source, only without functions.

这篇关于正则表达式从代码中删除方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆