
- 類型:服務(wù)器區(qū)大。21M語(yǔ)言:中文 評(píng)分:7.5
- 標(biāo)簽:
最近,我的一個(gè)老朋友向我打電話求助。他從事記者的職業(yè)有多年了,最近獲得了重新出版他的很多早期專欄的權(quán)利。他希望把他的作品貼在Web上;但是他的專欄都是以純文本文件的形式保存的,而且他既沒有時(shí)間也不想去為了把它們轉(zhuǎn)換成為 Web頁(yè)面而學(xué)習(xí)HTML的知識(shí)。由于我是他電話本里唯一一個(gè)精通計(jì)算機(jī)的人,所以他打電話給我看我是否能夠幫幫他。
“讓我來(lái)處理吧,”我說(shuō):“一個(gè)小時(shí)以后再給我打電話。”當(dāng)然了,當(dāng)他幾個(gè)小時(shí)以后打電話過(guò)來(lái),我已經(jīng)為他準(zhǔn)備好了解決的方法。這需要用到一點(diǎn)點(diǎn)PHP,而我收獲了他沒完沒了的感謝和一箱紅酒。
那么我在這一個(gè)小時(shí)里做了些什么呢?這就是本篇文章的內(nèi)容。我將告訴你如何使用PHP來(lái)快速將純ASCII文本完美地轉(zhuǎn)換成為可讀的HTML標(biāo)記。
首先讓我們來(lái)看一個(gè)我朋友希望轉(zhuǎn)換的純文本文件的例子:
Green for Mars!
John R. Doe
The idea of little green men from Mars, long a staple of science fiction, may soon turn out to be less fantasy and more fact.
Recent samples sent by the latest Mars exploration team indicate a high presence of chlorophyll in the atmosphere. Chlorophyll, you will recall, is what makes plants green. It's quite likely, therefore, that organisms on Mars will have, through continued exposure to the green stuff, developed a greenish tinge on their outer exoskeleton.
An interview with Dr. Rushel Bunter, the head of ASDA's Mars Colonization Project blah blah...
What does this mean for you? Well, it means blah blahblah...
Track follow-ups to this story online at
http://www.mars-connect.dom/
. To see pictures of the latest samples, log on to
http://www.asdamcp.dom/galleries/220/
相當(dāng)標(biāo)準(zhǔn)的文本:它有一個(gè)標(biāo)題、一個(gè)署名和很多段的文字。把這篇文檔轉(zhuǎn)換成為HTML真正需要做的是使用HTML的分行和分段標(biāo)記把原文的布局保留在Web頁(yè)面上。特殊的標(biāo)點(diǎn)符號(hào)需要被轉(zhuǎn)換成為對(duì)應(yīng)的HTML符號(hào),超鏈接需要變得可以點(diǎn)擊。
下面的PHP代碼(列表A)就會(huì)完成上面所有的任務(wù):
列表A
// set source file name and path
$source = "toi200686.txt";
// read raw text as array
$raw = file($source) or die("Cannot read file");
// retrieve first and second lines (title and author)
$slug = array_shift($raw);
$byline = array_shift($raw);
// join remaining data into string
$data = join('', $raw);
// replace special characters with HTML entities
// replace line breaks with
$html = nl2br(htmlspecialchars($data));
// replace multiple spaces with single spaces
$html = preg_replace('/ss /', ' ', $html);
// replace URLs with elements
$html = preg_replace('/s(w ://)(S )/', ' 12', $html);
// start building output page
// add page header
$output = HEADER
html>
head>
style>
.slug {font-size: 15pt; font-weight: bold}
.byline { font-style: italic }
/style>
/head>
body>
HEADER;
// add page content
$output .= "$slug";
$output .= "By $byline";
$output .= "$html";
// add page footer
$output .= FOOTER
/body>
/html>
FOOTER;
// display in browser
echo $output;
// AND/OR
// write output to a new .html file
file_put_contents(basename($source, substr($source, strpos($source, '.'))) . ".html", $output) or die("Cannot write file");
讓我們來(lái)看看它是如何工作的:
第一步是把純ASCII文件讀取到一個(gè)PHP數(shù)組里。這通過(guò)file()函數(shù)很容易就可以完成,這個(gè)函數(shù)會(huì)把文件的每一行都轉(zhuǎn)換成為一個(gè)用數(shù)字索引的數(shù)組中的元素。
然后,標(biāo)題和作者行(我假設(shè)這兩個(gè)都是文件的前兩行)都通過(guò)array_shift()函數(shù)從數(shù)組里提取出來(lái),放到單獨(dú)的變量里。數(shù)組剩下的成員然后被連接成一個(gè)字符串。這個(gè)字符串現(xiàn)在就包括了整篇文章的正文。
文章正文里像“'”、“”這樣的特殊符號(hào)通過(guò)htmlspecialchars()函數(shù)被轉(zhuǎn)換成相應(yīng)的HTML符號(hào)。為了保留文章的原始格式,分行和分段通過(guò)nl2br()函數(shù)被轉(zhuǎn)換成HTML的元素。文章中間多個(gè)空格通過(guò)簡(jiǎn)單的字符串替換被壓縮成為一個(gè)空格。
文章正文里的URL用正則表達(dá)式來(lái)檢測(cè),兩邊是元素。當(dāng)頁(yè)面在Web瀏覽器里顯示的時(shí)候,它會(huì)把URL轉(zhuǎn)換成為可點(diǎn)擊的超鏈接。
然后用標(biāo)準(zhǔn)的HTML規(guī)則創(chuàng)建輸出的HTML頁(yè)面。文章的標(biāo)題、作者和正文都用CSS樣式規(guī)則格式化。盡管這段腳本沒有這樣做,但是你可以在這個(gè)地方自定義最終頁(yè)面的外觀,你可以向模板添加圖形元素、顏色或者其他眩目的內(nèi)容。
一旦HTML頁(yè)面構(gòu)建完成,它就可以被送到瀏覽器或者用file_put_contents()保存為靜態(tài)文件。要注意的是,在保存的時(shí)候,原來(lái)的文件名會(huì)被分解,一個(gè)新的文件名(叫做filename.html)會(huì)為新創(chuàng)建的Web頁(yè)面創(chuàng)建。你然后就可以把這個(gè)Web頁(yè)面發(fā)布到Web服務(wù)器上、保存到光盤上或者對(duì)它進(jìn)行進(jìn)一步編輯。
注意:在使用這個(gè)腳本創(chuàng)建和保存HTML文件到磁盤的時(shí)候,你要確保這個(gè)腳本對(duì)文件保存的目錄有寫權(quán)限。
正如你看到的,假如你有標(biāo)準(zhǔn)格式的ASCII純文本數(shù)據(jù)文件,你可以相當(dāng)迅速用PHP把它轉(zhuǎn)換成為可使用的Web頁(yè)面。如果你已經(jīng)有了一個(gè)Web網(wǎng)站,并計(jì)劃把新的Web頁(yè)面加入進(jìn)來(lái),那么調(diào)試頁(yè)面生成器所使用的模板,使之適應(yīng)原有Web網(wǎng)站的外觀是相當(dāng)容易的。你自己試試看!