在PHP文件中查找多行字符串

时间:2017-03-30 22:43:59

标签: php arrays string file multilinestring

我正在开发一个程序,其中插件需要修改系统文件。

我有一个小方法,我在文件中找到字符串的开头,如下所示:

     /**
     * @param $fileName
     * @param $str
     *
     * @return int
     */
    private function getLineWithString($fileName, $str)
    {
        $lines = file($fileName);
        foreach ($lines as $lineNumber => $line) {
            if (strpos($line, $str) !== false) {
                return $line;
            }
        }
        return -1;
    }

我在我需要拉出该字符串的方法中调用它来代替它:

//  Set our file to use
$originalFile = 'file.php';

// Find The array['key'] string
$myString = "\$array['key']";

// Process - Find it
$lineNo = $this->getLineWithString($originalFile, $myString);

然后echo $lineNo;返回$array['key'] = array(

但是,我需要它将整个多行数组/字符串返回到下一个;(分号)。

我该怎么做?

由于

*编辑*

我的PHP文件内容如下:

<?php 
    /**
     * Comment here 
    */
     $first_array = array( 
         'key1' => 'val1', 
         'key2' => 'val2', 
         'key3' => 'val3', 
         'key4' => 'val4', 
         'key5' => 'val5' 
    );

    $second_array = array( 
        'key1' => 'val1', 
        'key2' => 'val2' 
    ); 
    ...

我尝试过@Scuzzy的建议

现在这是我的方法:

// Open Existing File And Get Contents
$myFile = file_get_contents('myFile.php');

$tokens = token_get_all($myFile);

foreach ( $tokens as $token ) {
    if (is_array($token)) {
        if( $token[0] === T_CONSTANT_ENCAPSED_STRING and strpos( $token[1], "\n" ) !== false )
        {
            var_dump( $token );
        }
    }
}

但是,这不会返回任何内容。

我需要返回类似的内容:

$second_array = array( 
    'key1' => 'val1', 
    'key2' => 'val2' 
);

作为一个字符串,我可以操作和重写。

2 个答案:

答案 0 :(得分:2)

我会调查http://php.net/manual/en/function.token-get-all.php,特别是T_CONSTANT_ENCAPSED_STRING中有新行字符

token.php

$code = file_get_contents('token.code.php');

$tokens = token_get_all( $code );

foreach ( $tokens as $token ) {
  if (is_array($token)) {
    if( $token[0] === T_CONSTANT_ENCAPSED_STRING and strpos( $token[1], "\n" ) !== false )
    {
      var_dump( $token );
    }
  }
}

token.code.php

<?php    
$bar = "single line";
$foo = "hello
multi
line
world";
$bar = 'single line';
$foo = 'hello
multi
line
world';

将打印多行而不是单行:

array(3) {
  [0]=>
  int(318)
  [1]=>
  string(27) ""hello
multi
line
world""
  [2]=>
  int(4)
}
array(3) {
  [0]=>
  int(318)
  [1]=>
  string(27) "'hello
multi
line
world'"
  [2]=>
  int(9)
}

答案 1 :(得分:2)

您可以使用var_export(),而不是尝试使用PHP解析PHP文件,具体取决于您需要执行的操作。

require_once($filename);

// variables are now in global scope
// manipulate as necessary
$first_array['this_key'] = 'that value';

$str = '$first_array = '.var_export($first_array, TRUE).";\n\n";
$str .= '$second_array = '.var_export($second_array, TRUE).';';

// output the updated arrays back to the file
file_put_contents($filename, $str);