2

编辑:函数的真实名称是CB_t

考虑一个包含多个文件和文件夹的项目。在整个项目中,我们使用不同的参数多次调用 CB_t($string='') 函数。我需要的是在调用此函数的所有时间以编程方式查找并使用参数创建一个数组。参数始终是字符串。

代码示例:

文件 1:

<?php
# Some code ....

$a = CB_t('A');
$b = CB_t("B");

# more code ...

文件 2:

<?php
# Some code ....

$c = CB_t("ABC");
$d = CB_t('1938');

# more code ...

我需要的是解析所有代码并创建一个包含所有参数的数组。在上述示例的情况下,数组应如下所示:

['A','B','ABC','1938']

以下是我到目前为止尝试的方法,但没有给出好的结果,因为有时使用简单引号调用该函数,有时使用双引号或使用大写或小写。

    $search = "F(";
    $path = realpath(ROOT); // ROOT defined as project root folder 
    $fileList = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::SELF_FIRST);
    $count = 0;$counter = 0;
    foreach ($fileList as $item) 
    {
        if ( $item->isFile() && substr($item->getPathName(), -4) =='.php')  // #1
        {

            $counter++;

            $file = file_get_contents($item->getPathName());


                if( strpos($file,trim($search)) !== false) {

                    $count++;

                    echo "<br>File no   : ".$count;
                    echo "<br>Filename  : ".$item->getFileName();
                    echo "<br>File path : ".$item->getPathName();
                    echo "<hr>";


                } // End file is php

            unset($file);

        } // End if #1

    } // End foreach

我认为这可以通过正则表达式以某种方式解决,但我不能很好地控制这部分。

提前致谢!

4

2 回答 2

1

这可能会奏效。那里有一些额外的注释用于分支重置。捕获组 1 将
包含字符串内容。

 Edit - If you want to make the regex into a C-style string, here it is:    

 "[Ff]\\s*\\(\\s*(?|\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')\\s*\\)"
 ---------------------------------------------------------


      #  [Ff]\s*\(\s*(?|"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)')\s*\)

      [Ff] 
      \s* 
      \(
      \s* 
      (?|
           " 
 br 1      (                              # (1 start)
                [^"\\]* 
                (?: \\ . [^"\\]* )*
    1      )                              # (1 end)
           "
        |  
           ' 
 br 1      (                              # (1 start)
                [^'\\]* 
                (?: \\ . [^'\\]* )*
    1      )                              # (1 end)
           '
      )
      \s* 
      \)

Edit2 - 用法示例:

 $string =
 "
 f('hello')
 F(\"world\")
 ";

 preg_match_all
      ( 
          "/[Ff]\\s*\\(\\s*(?|\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')\\s*\\)/",
          $string,
          $matches,
          PREG_PATTERN_ORDER
      );
  print_r( $matches[1] );

 -----------------------------
 Result:
 Array
 (
     [0] => hello
     [1] => world
 )
于 2013-10-09T18:19:32.083 回答
1

我不确定正则表达式是否足够聪明,但这应该让你接近:

foreach ($fileList as $item) 
{
    if ( $item->isFile() && substr($item->getPathName(), -4) =='.php')  // #1
    {
        $counter++;

        $file = file_get_contents($item->getPathName());
        $matches= array();

        $count= preg_match_all('/\bCB_t\s*\(\s*[\'"](.*?)[\'"]\s*\)/i', $file, $matches);

        echo "<br>File no   : ".$count;
        echo "<br>Filename  : ".$item->getFileName();
        echo "<br>File path : ".$item->getPathName();
        echo "<hr>";

        unset($file);

        $total+= $count;
    } // End if #1

} // End foreach

正则表达式查找一个CB_t(或一个cb_t-- 末尾的 i 使其不区分大小写)后跟零个或多个空格,后跟一个(零个或多个空格(再次),后跟一个单引号或双引号。(显然,这与使用可变参数调用 CB_t 的任何地方都不匹配,例如CB_t($somevar)- 您需要为此进行调整。)

然后它使用调用的结果preg_match_all来计算页面上的匹配数。(我也添加了一个 $total 计数 - 我在自己的测试中使用它!)

我知道正则表达式存在的一个问题是它仍然会计算对出现在注释或另一个字符串中的 CB_t 的调用,例如

/* CB_t('fred'); */
$somevar= 'CB_t("fred")';

两者都会被计算在内。

希望能帮助到你!

(为粗心粘贴而编辑)

(再次编辑以包含 Galvic 改进的 RegExp 并根据要求更改函数名称。)

于 2013-10-09T18:29:47.330 回答