arrays — поиск многострочной строки в файле PHP

Я работаю над программой, в которой аддон должен изменить системный файл.

У меня есть небольшой метод, в котором я нахожу начало строки в файле, как это:

     /**
* @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

Решение

Вместо того, чтобы пытаться анализировать PHP-файл в PHP, в зависимости от того, что вам нужно сделать, вы можете использовать var_export().

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);
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)
}
2

По вопросам рекламы [email protected]