PHP加载匹配strpos的2行之间的所有行并移动到数组

时间:2014-09-23 20:39:14

标签: php string strpos

我有一个包含大量信息的文本文件。我需要拉出两条线之间的所有线,这两条线匹配一个字符串。

以下是文件外观的示例:

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_sequencedo end_sequence之间的所有行。然后我将这些行加载到一个数组中(这部分我可以毫无问题地处理)。

现在我将整个文件转换为数组,每个新行都是数组中的新值。如何在匹配的字符串(do start_sequencedo end_sequence)之间提取所有值并将它们放在一个单独的数组中?

5 个答案:

答案 0 :(得分:1)

拍了一张照,这就是我想出来的。

它使用$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 :(得分: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]));

Working example.

答案 2 :(得分:0)

你可以使用这样的正则表达式:

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

$matches[1]内,您将获得原始格式所需的文本部分(就像在文件中一样)。然后,您可以像使用完整文件一样分割线条。

答案 3 :(得分: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);

答案 4 :(得分: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]);