2014-02-18 3 views
2

У меня есть текстовый файл, который всегда содержит такие строки:Получить строку после матча найти в PHP

CODICE FISCALE DATA DI STAMPA 

01097800625 

... 
... 

CODICE FISCALE 

FRRVCN68S14E487E <------------------------I need this line 
DATA ASSUNZIONE DATA 

Я хотел бы разобрать текст, чтобы получить отмеченную линию. Я попытался взорвать текст между «CODICE FISCALE» и «DATA ASSUNZIONE DATA», но он не работает. Любое предложение?

function getBetween($content,$start,$end){ 
    $r = explode($start, $content); 

    if (isset($r[1])){ 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 
    return ''; 
} 
$newName  = getBetween($fileContent,'CODICE FISCALE','DATA ASSUNZIONE DATA'); 

ответ

1
preg_match('/CODICE FISCALE\n(.*?)DATA ASSUNZIONE DATA/s', $fileContent, $match); 
$match[1] contains your line. 

Смотрите демо здесь: Demo

+0

спасибо. И если бы я соответствовал точному числу символов в строке? В примере это 16 ... – giuseppe

+0

'preg_match ('/ CODICE FISCALE \ n (. {0,16}). *? DATA ASSUNZIONE DATA/s', $ fileContent, $ match);' – Manu

0

Вы можете сделать это с помощью следующего кода с помощью простого explode()

$file_content = file_get_contents("your_file.txt"); 
$file_content_separated_by_special_word = explode("\nCODICE FISCALE", $file_content); 
$res = explode("\n", ltrim($file_content_separated_by_special_word[1])); 

Я разобранный с "\ nCODICE Fiscale", потому что "CODICE Fiscale" взрывает с первым совпадением.

Вы можете увидеть рабочий пример here

+0

Это doesn'work на всех ... – giuseppe

+0

@giuseppe увидеть мой обновленный ответ и рабочую демо –

+1

@giuseppe это на самом деле это самый прямой ответ на ваш вопрос. Просто поставьте «\ n» перед вашим $ start и $ end, и он будет работать – aaaaahhhhh

0

Использование fegts вы можете получить один из файла. Вы можете создать нечто вроде анализатора потока и установить маркер, если была найдена строка «DATA ASSUNZIONE DATA». Затем верните или сохраните следующую непустую строку и сбросьте этот маркер. Таким образом, вы можете найти эти строки в файлах с несколькими блоками («CODICE FISCALE ... DATA ASSUNZIONE DATA»).

Посмотрите, например, на this JSON parsers source, чтобы узнать, как настроить такой скрипт.

0

Эта функция получит строку после некоторого текста, возвращает null, если не найден.

function getLineAfter($file_path, $line) { 
    $lines = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
    if (($key = array_search($line, $lines)) !== false && isset($lines[$key + 1])) { 
     return $lines[$key + 1]; 
    } 
    return null; 
} 

Использование:

echo getLineAfter('somefile.txt', 'CODICE FISCALE'); 
1

Хотя я предпочел бы другие решения, если вы хотите использовать регулярные выражения, вы можете использовать

/^CODICE FISCALE\n([\s\S]+)DATA ASSUNZIONE DATA/m 

demo @ phpliveregex
demo @ regex101

Для пример с использованием preg_match_all:

preg_match_all("/^CODICE FISCALE\n([\s\S]+)DATA ASSUNZIONE DATA/m", $input_lines, $output_array); 

Вы можете даже реорганизовать getBetween функцию:

function getBetween($content,$start,$end){ 
    preg_match_all("/^".$start."\n([\s\S]+)".$end."/m", $content, $output); 
    return $output; 
} 

working example @ phpfiddle

0

Вместо использования explode(), я бы рекомендовал вы пытаетесь использовать preg_match() (документация может быть found here).

Вот PHP код, который показывает его в действии:

$string = <<<EOS 
CODICE FISCALE DATA DI STAMPA 

01097800625 

... 
... 

CODICE FISCALE 

FRRVCN68S14E487E 
DATA ASSUNZIONE DATA 
EOS; 

preg_match("/\n(.*)\nDATA ASSUNZIONE DATA/", $string, $matches); 
print 'I need this line: ' . $matches[1] . "\n"; 

Это ищет вашу строку для перехода на новую строку, а затем кучу текста на одной строке, а затем перевод строки, а затем «DATA ASSUNZIONE DATA» , Текст, снятый (.*), захватывается в элемент массива, $matches[1].

Вот выход кода запуска:

I need this line: FRRVCN68S14E487E 
Смежные вопросы