某記者需將數百篇純文本專欄發布到網站,但不懂 HTML。需求:保留標題/作者/段落結構,特殊字符轉義,URL 自動轉超鏈接,一鍵生成靜態 HTML 文件。
<?php
// 配置
$source = "article.txt"; // 源文件
$output_dir = "./output/"; // 輸出目錄
// 1. 讀取文件為數組(每行一個元素)
$raw = file($source, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)
or die("無法讀取源文件");
// 2. 提取標題、作者(假設前兩行)
$title = array_shift($raw);
$author = array_shift($raw);
// 3. 合併正文並處理
$body = implode("\n", $raw);
// 3.1 特殊字符轉義(防 XSS、保留原意)
$body = htmlspecialchars($body, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
// 3.2 換行轉
(保留段落結構)
$body = nl2br($body);
// 3.3 多餘空白壓縮
$body = preg_replace('/[ \t]+/', ' ', $body);
// 3.4 URL 自動轉超鏈接(增強版:支持 http/https/ftp/www)
$body = preg_replace_callback(
'/(?:(https?|ftp):\/\/|www\.)[^\s<>"\']+/i',
function ($m) {
$url = $m[0];
$href = (strpos($url, '://') === false) ? "https://$url" : $url;
return "$url";
},
$body
);
// 4. 構建完整 HTML(引入 CSS 框架或內聯樣式)
$html = <<<HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>$title</title>
<style>
body {font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.7; max-width: 800px; margin: 2rem auto; padding: 0 1rem; color: #333;}
h1 {border-bottom: 2px solid #2c3e50; padding-bottom: .5rem;}
.meta {color: #666; font-size: .9rem; margin-bottom: 1.5rem;}
a {color: #3498db; text-decoration: none;}
a:hover {text-decoration: underline;}
</style>
</head>
<body>
<article>
<h1>$title</h1>
<p class="meta">作者:$author | 生成時間:<?= date('Y-m-d H:i:s') ?></p>
<div class="content">$body</div>
</article>
</body>
</html>
HTML;
// 5. 輸出:瀏覽器預覽 或 寫入靜態文件
// 瀏覽器預覽
// echo $html;
// 寫入文件(文件名基於源文件)
$filename = pathinfo($source, PATHINFO_FILENAME) . '.html';
file_put_contents($output_dir . $filename, $html) or die("寫入失敗");
echo "生成成功:$output_dir$filename";
?>
| 函數 | 作用 | 關鍵參數 |
|---|---|---|
file() | 整文件讀入數組 | FILE_IGNORE_NEW_LINES 去除行尾換行符 |
array_shift() | 彈出數組首元素 | 依次提取標題、作者 |
htmlspecialchars() | 轉義 < > & ' " | ENT_QUOTES | ENT_SUBSTITUTE 雙引號+無效字符替換 |
nl2br() | \n → <br> | 保留原始換行結構 |
preg_replace_callback() | URL 智能識別與替換 | 支持 www. 開頭、自動補全協議、rel="noopener" 安全 |
erusev/parsedown,源文件用 Markdown 寫作,渲染更豐富glob("articles/*.txt"),生成索引頁 + RSS Feed<img> 外鏈,下載存儲並重寫 src<?php
// batch_convert.php
$srcDir = __DIR__ . '/articles';
$outDir = __DIR__ . '/public';
$tpl = file_get_contents(__DIR__ . '/template.html');
foreach (glob("$srcDir/*.txt") as $file) {
$lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$title = array_shift($lines);
$author = array_shift($lines);
$body = implode("\n", $lines);
$body = nl2br(htmlspecialchars($body, ENT_QUOTES, 'UTF-8'));
$body = preg_replace_callback('/(https?:\/\/|www\.)\S+/i', fn($m)=><a href=\"$m[0]\" target=\"_blank\">$m[0]</a>, $body);
$html = str_replace(
['{{title}}', '{{author}}', '{{body}}', '{{date}}'],
[$title, $author, $body, date('Y-m-d')],
$tpl
);
$outFile = "$outDir/" . basename($file, '.txt') . '.html';
file_put_contents($outFile, $html);
echo "✓ $outFile\n";
}
echo "批量完成!\n";
避坑提醒:源文件編碼必須為 UTF-8(含 BOM 會導致標題異常),建議編輯器統一設置「UTF-8 without BOM」;生成的 HTML 檔案名避免中文,防服務器兼容性問題。