string — PHP загружает все строки между 2 строками, совпадающими с strpos, и перемещается в массив

У меня есть текстовый файл с кучей информации в нем. Мне нужно вытащить все строки, которые находятся между 2 линиями, где эти две строки соответствуют строке.

Вот пример того, как файл будет выглядеть:

def var test:1
def string myString:My String

do start_sequence
do perform:1
wait
do perform:2
do end_sequence

def var testTwo:2
do perform:3

Этот файл выводится другой системой, которую я не могу изменить. Что мне нужно сделать, это загрузить все строки между do start_sequence а также do end_sequence, Затем я буду загружать эти строки в массив (эту часть я могу обработать без проблем).

Прямо сейчас я превращаю весь файл в массив, каждая новая строка является новым значением в массиве. Как вытащить все значения между совпадающими строками (do start_sequence а также do end_sequence) и поместить их в отдельный массив?

0

Решение

Сделал снимок и вот что я придумал.

Оно использует $reading чтобы указать, следует ли записывать строки в другую переменную. Надеюсь это поможет.

$data = <<< EOF
def var test:1
def string myString:My String

do start_sequence
do perform:1
wait
do perform:2
do end_sequence

def var testTwo:2
do perform:3
EOF;

$lines = explode("\n", $data);

$data = array();

$reading = false;
foreach($lines as $line)
{
if ($reading == true && $line == 'do end_sequence')
$reading = false;

if ($reading)
{
$data[] = $line;
}

if ($line == 'do start_sequence')
$reading = true;
}

var_dump($data);

Это выведет следующее

array (size=3)
0 => string 'do perform:1' (length=12)
1 => string 'wait' (length=4)
2 => string 'do perform:2' (length=12)
1

Другие решения

Я пошел с решением регулярных выражений просто для удовольствия — http://regexr.com/39i6o

(do perform)(?:.|[\n\r])+(?=do end_sequence)

Вот код PHP, который поместит каждую строку в массив:

$pattern = '/(do perform)(?:.|[\n\r])+(?=do end_sequence)/';
preg_match($pattern, $data, $matches);
$newArray = explode("\n",trim($matches[0]));

Рабочий пример.

1

Вы можете использовать регулярные выражения, как это:

$text = file_get_contents('t.txt');
preg_match_all("/.*do start_sequence(.*)do end_sequence.*/s", $text, $matches);

внутри $matches[1] у вас будет часть текста, которую вы хотите в необработанном формате (так же, как в файле). Затем вы можете разбить строки, как вы уже делаете с полным файлом.

0

так как у вас есть массив строк, просто знание индекса startString и endString решает вашу проблему.

$a=array ("A","B","C","Comes before","D","E");
$startIndex=array_search("A", $a);
$endIndex= array_search("D", $a);
$neddedArray=  array_slice($a, $startIndex+1,($endIndex-$startIndex)-1);
print_r($neddedArray);
0

Попробуй это

$originalString = file_get_contents('yourFile.txt');
$tempArray = explode('do start_sequence', $originalString);
$str = explode('do end_sequence', $tempArray[1]);
$finalArray = $explode('\n', $str[0]);
0
По вопросам рекламы [email protected]