我有一个文本文件,里面有一堆信息。我需要提取两行之间的所有行,其中这两行匹配一个字符串。
以下是文件的外观示例:
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
)之间的所有值,并将它们放在一个单独的数组中?
拍了一张照片,下面是我的想法。
它使用$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)
我使用正则表达式解决方案只是为了好玩-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]));
工作示例。
您可以使用这样的正则表达式:
$text = file_get_contents('t.txt');
preg_match_all("/.*do start_sequence(.*)do end_sequence.*/s", $text, $matches);
在$matches[1]
中,您将获得原始格式的文本部分(就像文件中一样)。然后,您可以像对完整文件所做的那样拆分行。
由于您有一个字符串数组,只需知道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);
试试这个
$originalString = file_get_contents('yourFile.txt');
$tempArray = explode('do start_sequence', $originalString);
$str = explode('do end_sequence', $tempArray[1]);
$finalArray = $explode(''n', $str[0]);