2014-02-18 50 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」爆炸,因爲「稅號」與第一次出現爆炸下面的代碼。

你可以看到工作演示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上的例子,以獲得sn靈感如何設置這樣的腳本。

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