我有一个包含大量信息的文本文件。我需要拉出两条线之间的所有线,这两条线匹配一个字符串。
以下是文件外观的示例:
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 :(得分: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]));
答案 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]);