shell 如何查找PHP文件是否有与类名相同的构造函数?

6rqinv9w  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(140)

我正在检查PHP文件,看看它们的构造函数是否与类名同名。类的名称是未知的,直到“class”后面的单词被捕获。例如:'class fooBar'将有一个匹配的'function fooBar',但是,可能不是同一种情况,例如:'function foobar'。我尝试了各种工具和管道,但发现在为变量赋值时,获取“class”后面的单词以搜索“function match”是有问题的。我现在所做的就是简单地循环所有的.php文件,并grepping 'class '。结果应该是一个文件路径的列表,这些路径已经成功匹配了'class fooBar'和函数fooBar。

find . -type f -name '*.php' -print0 | xargs -0 grep 'class ' | awk <magic goes here>
vecaoik1

vecaoik11#

至少可以尝试这样做,使用任何awk,并假设你想在所有文件中匹配class-function,而不仅仅是在一个文件中:

find . -type f -name '*.php' |
awk '
    NR == FNR {
        ARGV[ARGC++] = $0
        next
    }
    { sub(/[^[:alnum:]_]+$/,"",$2) }
    $1 == "class"    { classes[$2] = FILENAME }
    $1 == "function" { functions[$2] = FILENAME }
    END {
        for ( name in classes ) {
            if ( name in functions ) {
                print name, classes[name], functions[name]
            }
        }
    }
'

如果你真的希望比较不区分大小写,那么改变:

  1. functions[$2]functions[tolower($2)]
  2. name in functionstolower(name) in functions
  3. functions[name]functions[tolower(name)]
    因此比较是不区分大小写的,但输出显示原始的大小写混合类名。
    以上假设名称与每个输入文件中的函数或类在同一行上,即你从来没有:
function
foo

class
foo
alen0pnh

alen0pnh2#

如果你可以使用GNU sed,并且你的php文件不包含NUL字符,并且函数声明总是在类声明之后,并且没有字符串,注解或其他元素看起来像类或函数声明,而它们不是:

find . -type f -name '*.php' -exec bash -c '
  sed -Enz "s!\<class\>\s+(\w+).*\<function\>\s+\1\>!$1!p" "$1"' _ {} \;

诀窍在于sed-z选项,它可以一次搜索整个文件,并允许像搜索单行文本一样搜索它。

相关问题