There are several ways to:
With regular expressions:
Search for a single record
$data = '1000#
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.#
1001#
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.#';
function buscarTexto($id, $data) {
$re = '/(?<=^'.$id.'#\r?\n).+?(?=#$)/sm';
return preg_match($re, $data, $match) ? $match[0] : null;
}
Brief explanation of regular expression
/
(?<=^ #Casa a linha do id registro sem capturá-la
$id #id do registro
#\n)
.+? #Casa o texto e o captura
(?=#$) #Casa o delimitador final do texto sem capturá-lo
/smx
#o flag s faz com que o ponto capture as quebras de linhas
#o flag m faz com que os operadores ^ e $ casem o inicio e final das linhas
#o flag x não foi utilizado no código mas faz com que o espaços presentes na expressão não sejam considerados.
Load all records in an array where the key is the id.
function buscarTextos($data) {
$re = '/(?<id>^\d+)(?:#\r?\n)(?<text>.+?)(?:#$)/sm';
$result = [];
if(preg_match_all($re, $data, $matches, PREG_SET_ORDER))
//Converte o resultado da expressão em um array id => texto
foreach($matches as $m)
$result[$m['id']] = $m['text'];
return $result;
}
Brief explanation of regular expression
/
(?<id>^\d+) #Armazena id do registro em um grupo separado
(?:#\n) #Casa o delimitador do id e a quebra de linha
(?<texto>.+?) #Armazena o texto em outro grupo
(?:#$) #Casa o delimitador final do texto
/gsmx
#o flag g faz com que sejam capturadas todos os registros
#o flag s faz com que o ponto capture as quebras de linhas
#o flag m faz com que os operadores ^ e $ casem o inicio e final das linhas
#o flag x não foi utilizado no código mas faz com que o espaços presentes na expressão não sejam considerados.
No regular expressions
Read row by line and return desired record
function buscarTexto2($id, $data) {
$rows = explode("\n", $data);
$id = $id.'#';
$text = '';
$found = false;
foreach($rows as $r) {
//Remove possíveis espaços em branco
$r = trim($r);
//Verifica se a linha corresponde ao id do registro selecionado
if($r === $id)
$found = true;
//Caso tenha encontrado o registro
elseif($found) {
//Aqui é assumido que o texto pode ter diversas linhas
$text .= $text == '' ? $r : PHP_EOL.$r;
//Então caso a linha lida termine com $
if(substr($text, -1, 1) == '#')
//Retorna o texto
return substr($text, 0, -1);
}
}
}
Read row by line and store all records in an array where the key is the id.
function buscarTextos2($data) {
$rows = explode("\n", $data);
$id = null;
$text = '';
$result = [];
foreach($rows as $r) {
//Remove possíveis espaços em branco
$r = trim($r);
//verifica se algum registro está sendo processado no momento
if($id === null) {
//Ignora linhas em branco caso nenhum registro esteja sendo processado no momento.
if(!$r)
continue;
//Armazena o id e desconsidera o último caractere que é o $
$id = substr($r, 0, -1);
} else {
//Aqui é assumido que o texto pode ter diversas linhas
$text .= $text == '' ? $r : PHP_EOL.$r;
//Então caso a linha lida termine com $
if(substr($text, -1, 1) == '#') {
//Adiciona o registro ao array
$result[$id] = substr($text, 0, -1);
//E se prepara para o processamento de um novo registro
$id = null;
$text = '';
}
}
}
return $result;
}
In all functions it has been assumed that # (hashtag) is the last character of the line.
You can test the code at the following link link
If you want to use them with the file content do the following:
$dados = file_get_contents('caminho do arquivo');
$texto = buscarTexto(1000, $dados);
//ou
$texto = buscarTexto2(1000, $dados);
//ou
$textos = buscarTextos($dados);
//ou
$textos = buscarTextos2($dados);