2017-07-17 185 views
-2

嘗試搜索文本文件中的字符串,並將其替換爲HTML代碼,該代碼可能是外部文件引用同一文件中的錨/書籤。在PHP中搜索文本文件

已添加圖表。

藍線:如果存在具有相應名稱的文件,則用HREF鏈接替換爲該文件。

紅線:如果文件不存在AND該引用可以在本地文件中找到,那麼它是一個HREF鏈接到錨/書籤。

感謝ArminŠupuk對他以前的回答,幫助我做了藍線(這是一種享受!)。然而,我正在努力整理紅線。即在本地文件中搜索對應的鏈接。

Amended Diagram

最後,這是我一直在標題下的路徑,其未能在否則如果獲得匹配;

$file = $_GET['file']; 
$file1 = "lab_" . strtolower($file) . ".txt"; 
$orig = file_get_contents($file1); 
$text = htmlentities($orig); 
$pattern2 = '/LAB_(?<file>[0-9A-F]{4}):/'; 
$formattedText1 = preg_replace_callback($pattern, 'callback' , 
$formattedText); 

function callback ($matches) { 

if (file_exists(strtolower($matches[0]) . ".txt")) { 
return '<a href="/display.php?file=' . strtolower($matches[1]) . '" 
style="text-decoration: none">' .$matches[0] . '</a>'; } 

else if (preg_match($pattern2, $file, $matches)) 

{ 

return '<a href = "#LAB_' . $matches[1] . '">' . $matches[0] . '</a>'; } 

else { 
return 'LAB_' . $matches[1]; } 
} 

Current output diagram

+1

前幾天你沒有問過完全一樣的東西嗎?有些麻煩? –

+1

爲什麼你不使用數據庫呢? –

+0

@Armin - 類似但略有不同! – TimJ

回答

0

有些事情:

  1. 嘗試寫下你的代碼中一些常用的格式。遵循一些代碼造型指南,至少你自己。使其連貫一致。
  2. 請勿使用名稱爲$formattedText1$pattern2的變量。命名差異。
  3. 使用anonymous functions (Closures)而不是編寫函數聲明的函數,你只能使用一次。

我改名一些變量,以使其更清晰這是怎麼回事,並去除不必要的東西:

$fileId = $_GET['file']; 
$fileContent = htmlentities(file_get_contents("lab_" . strtolower($fileId) . ".txt")); 

//add first the anchors 
$formattedContent = preg_replace_callback('/LAB_(?<file>[0-9A-F]{4}):/', function ($matches) { 
    return '<a href="#'.$matches[1].'">'.$matches[0].':</a>'; 
}, $fileContent); 
//then replace the links 
$formattedContent = preg_replace_callback('/LAB_(?<file>[0-9A-F]{4})/', function ($matches) { 
    if (file_exists(strtolower($matches[0]) . ".txt")) { 
    return '<a href="/display.php?file=' . strtolower($matches[1]) . 
     '"style="text-decoration: none">' .$matches[0] . '</a>'; 
    } else if (preg_match('/LAB_' . $matches[1] . ':/', $formattedContent)) { 
    return '<a href = "#LAB_' . $matches[1] . '">' . $matches[0] . '</a>'; 
    } else { 
    return 'LAB_' . $matches[1]; } 
}, $formattedContent); 

echo $formattedContent; 

應該清楚發生了什麼事情。

+0

非常感謝。現在理解這個代碼會更好一些 - 但是最終的結果還是很困難。稍微修改了一下這個圖表,試圖更好地解釋它。外部文件鏈接的工作方式與標記本地文件中的書籤一樣 - 但我仍然遇到問題,試圖將每個文件中的鏈接添加到同一文件中的書籤中。 – TimJ

+0

如果你可以用當前結果的一部分編輯你的問題,然後用那個例子解釋什麼是不正確的,這將會有所幫助。我很抱歉,但你有一個複雜的格式問題,並修復它沒有應格式化的文件是該死的難。 –

+0

添加新圖來嘗試顯示當前腳本輸出。腳本做3件事。 步驟(1)在LAB_xxxx格式的文件中搜索所有內容:並將其變爲書籤。這工作。 步驟(2)是在Web服務器上查找與LAB_xxxx格式相同名稱的文件名的任何匹配項,如果找到,則創建一個到該文件的HTML鏈接。這也適用。 步驟(3)是查找LAB_xxxx格式中未被步驟(2)拾取的任何剩餘文本,並將其轉變爲超鏈接到步驟(1)中創建的書籤。這是我正在努力的一點。 – TimJ