【问题标题】:Finding all PHP functions in a file查找文件中的所有 PHP 函数
【发布时间】:2015-08-04 16:00:14
【问题描述】:

我想在一个文件中查找所有函数 - 没问题:

preg_match_all("/function[\s\n]+(\S+)[\s\n]*\(/", $data, $outputData);

问题是,如果有 Javascript 函数,它们也会进入方案中。

是否有可能只获得 PHP 函数。 一个指标是<script>-Tag,但我不知道如何只跟踪未被script-Tag 包围的函数!

谢谢!

【问题讨论】:

  • 这会打开一个巨大的蜡球。有多种“隐藏”脚本标签的方法。例如有 js 会产生 js,你最终会得到像 document.write('<sc' + 'ript>')<?php echo '<s', 'cript>' ?> 这样的愚蠢的东西。祝你好运……
  • @MarcB 你是对的!它只会变得一团糟——但幸运的是我得到了另一个解决方案。它似乎工作:-) 无论如何谢谢!

标签: javascript php


【解决方案1】:

在写完问题 2 秒后,我就有了THE的想法。

$data = file_get_contents($file);   

$data = preg_replace("/<script[^>]*>[\s\S]*?<\/script>/", "", $data);
preg_match_all("/function[\s\n]+(\S+)[\s\n]*\(/", $data, $outputData);

只需删除所有&lt;script&gt;-标签! 如果您以后需要它们,您也可以保存它们(而不是替换它们)并在以后添加它们!

如果其他人也会遇到同样的问题!

【讨论】:

    【解决方案2】:

    一种选择是在处理之前删除所有&lt;script&gt;...&lt;/script&gt; 标记,但这假设您将只在文件中直接在这些标记中包含JavaScript。如果您有一个为您生成 HTML 的函数或库,那么您可以输出 JavaScript 代码,而无需在 PHP 文档中明确包含 &lt;script&gt;...&lt;/script&gt; 标记。问题是您正在使用模式匹配,这可能会导致一系列误报。

    要同时消除这些误报,您可以使用PHP ReflectionFunction class 来确定哪些函数是在PHP 中定义的,哪些不是。一旦你有一个可能的函数名数组,使用以下:

    $data = file_get_contents($file);   
    $outputData;
    $validMatches=array();
    preg_match_all("/function[\s\n]+(\S+)[\s\n]*\(/", $data, $outputData);
    
    foreach($outputData[1] as $match) {
        $isValid=true;
        try {
            $reflection = new \ReflectionFunction($match);
        } catch (\ReflectionException $e) {
            $isValid=false;
        }
        if($isValid == true) {
            $validMatches[]=$match;
        }
    }
    

    这更冗长,但它保证您将获得一个仅包含 PHP 函数名称的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2021-05-29
      • 2012-08-05
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多