【PHP程式設計+MySQL資料庫+PHPMaker整合教學+技術諮詢】 本月特價優惠中! 動態的架站程式時代,要自訂PHP程式頁面有那麼難嗎? MySQL『資料庫』與『資料表』,用PHP程式有那麼難控制嗎? 你不用死背『PHP程式』與『MySQL資料庫』語法也能獨自設計完成! 這是自動化軟體程式的年代 (用PHPMaker 設計在彈指之間就能自動生成整個 PHP 程式系統) 這不是:神話!程式軟體模組取代了這一切複雜的工程。 你可以自己建構自己專屬的: 訂購表單、會員名單、擴增購物車特殊頁面 →POS 系統、CRM 系統、ERP 系統、HRM 系統...等等 (更可以加入數據資源銷售賺錢!) 該是:【見證奇蹟】的時候了! 非親眼所見....真的無法相信此神兵利器!

您知道最短的PHP微網誌程式代碼如何編寫嗎?

最短的PHP微網誌程式。
基本需求是:
1.無亂碼(最好UTF-8)。
2.有輸入框可以發佈新訊息。
3.送出後馬上可以看到新發的內容。
4.必須使用POST模式送出。
5.訊息後面要有時間標示。
6.不能發佈任何HTML標籤。

<?php
header("content-type:text/html; charset=utf-8");
$a=@file_get_contents(l);
($p=$_POST[s])&&file_put_contents(l,$a='<hr>'.htmlspecialchars($p).date(' Y-m-d H:i').$a);
echo '<form method=post><input name=s></form>'.$a;
?>

運行效果如圖:

註釋一下:

<?php
header("content-type:text/html; charset=utf-8"); //傳送到utf-8聲明
/*
* 從名叫l的檔案裡面讀取資料。
* php裡面的常量如果沒有先聲明,那麼預設值是等於常量本身的那個字串。
* 也就是說沒有聲明過的l=="l" , ABCD == "ABCD"
*/
$a=@file_get_contents(l);
/*
* a && b; 貌似是php特有的語法結構。 大概意思是 先執行a,
* 然後判斷a是否為true,如果是,那麼繼續執行b
*
* ($p=$_POST[s]) 是先把$_POST[s]的值賦給$p,
* 然後括號的值為$p轉換為布爾型。也就是說,只要$p不是空字串,
* 或是false,或是0,或是null。就會繼續執行後面的語句
*
* 後面操作是把剛剛讀出來的$a的前面加上新的資料,然後寫入l檔案
*/
($p=$_POST[s])&&file_put_contents(l,$a='<hr>'.htmlspecialchars($p).date(' Y-m-d H:i').$a);
/*
* 顯示html語句,用於構造一個可以post送出的輸入框,沒有送出按鈕,直接按換行送出。
* 由於頁面是用utf-8編碼,所以送出的資料也是utf-8編碼
*/
echo '<form method=post><input name=s></form>'.$a;//#註釋2
?>

正則表達式是一個無比強大的工具.任何地方我們都可能用到它…
原來刻苦的啃過 正則表達式,但時間長了還是會忘…
今天又來溫習一下..看到一篇不錯的文章..所以就轉過來收藏下.

前言:
半年前我對正則表達式產生了興趣,在網上尋找過不少資料,看過不少的教學,最後在使用一個正則表達式工具RegexBuddy時發現他的教學寫的非常好,可以說是我目前見過最好的正則表達式教學。於是一直想把他翻譯過來。這個願望直到這個五一長假才得以實現,結果就有了這篇文章。關於本文的名字,使用「深入淺出」似乎已經太俗。但是通讀原文以後,覺得只有用「深入淺出」才能準確的表達出該教學給我的感受,所以也就不能免俗了。
本文是Jan Goyvaerts為RegexBuddy寫的教學的譯文,版權歸原作者所有,歡迎轉載。但是為了尊重原作者和譯者的勞動,請註明出處!謝謝!

1.什麼是正則表達式

基本說來,正則表達式是一種用來描述一定數量文字的模式。Regex代表Regular Express。本文將用<<regex>>來表示一段具體的正則表達式。

一段文字就是最基本的模式,簡單的符合相同的文字。

2.不同的正則表達式引擎

正則表達式引擎是一種可以處理正則表達式的軟體。通常,引擎是更大的應用程式的一部分。在軟體世界,不同的正則表達式並不互相相容。本教學會集中討論Perl 5 類型的引擎,因為這種引擎是應用最廣泛的引擎。同時我們也會提到一些和其他引擎的區別。許多近代的引擎都很類似,但不完全一樣。例如.NET正則庫,JDK正則包。

3.文字元號

最基本的正則表達式由單個文字元號組成。如<<a>>,它將符合字串中第一次出現的字元「a」。如對字串「Jack is a boy」。「J」後的「a」將被符合。而第二個「a」將不會被符合。

正則表達式也可以符合第二個「a」,這必須是你告訴正則表達式引擎從第一次符合的地方開始搜尋。在文字編輯器中,你可以使用「尋找下一個」。在寫程式語系中,會有一個函數可以使你從前一次符合的位置開始繼續向後搜尋。

類似的,<<cat>>會符合「About cats and dogs」中的「cat」。這等於是告訴正則表達式引擎,找到一個<<c>>,緊跟一個<<a>>,再跟一個<<t>>。

要注意,正則表達式引擎預設是大小寫敏感的。除非你告訴引擎忽略大小寫,否則<<cat>>不會符合「Cat」。

    特殊字元

對於文字字元,有12個字元被保留作特殊用途。他們是:

[ ] ^ $ . | ? * + ( )

這些特殊字元也被稱作元字元。

如果你想在正則表達式中將這些字元用作文字字元,你需要用反斜槓「」對其進行換碼 (escape)。例如你想符合「1+1=2」,正確的表達式為<<1+1=2>>.

需要注意的是,<<1+1=2>>也是有效的正則表達式。但它不會符合「1+1=2」,而會符合「123+111=234」中的「111=2」。因為「+」在這裡表示特殊含義(重複1次到多次)。

在寫程式語系中,要注意,一些特殊的字元會先被編譯器處理,然後再傳遞給正則引擎。因此正則表達式<<1+2=2>>在C++中要寫成「1+1=2」。為了符合「C: emp」,你要用正則表達式<<C: emp>>。而在C++中,正則表達式則變成了「C: emp」。

    不可顯示字元

可以使用特殊字元序列來代表某些不可顯示字元:

<< >>代表Tab(0×09)

<<
>>代表換行符(0x0D)

<<
>>代表換行符(0x0A)

要注意的是Windows中文字檔案使用「
」來結束一行而Unix使用「
」。

4.正則表達式引擎的內定工作機制

知道正則表達式引擎是如何工作的有助於你很快理解為何某個正則表達式不像你期望的那樣工作。

有兩種類型的引擎:文字導向(text-directed)的引擎和正則導向(regex-directed)的引擎。Jeffrey Friedl把他們稱作DFA和NFA引擎。本文談到的是正則導向的引擎。這是因為一些非常有用的特性,如「惰性」量詞(lazy quantifiers)和反向引用(backreferences),只能在正則導向的引擎中實現。所以毫不意外這種引擎是目前最流行的引擎。

你可以輕易分辨出所使用的引擎是文字導向還是正則導向。如果反向引用或「惰性」量詞被實現,則可以肯定你使用的引擎是正則導向的。你可以作如下測試:將正則表達式<<regex|regex not>>應用到字串「regex not」。如果符合的結果是regex,則引擎是正則導向的。如果結果是regex not,則是文字導向的。因為正則導向的引擎是「猴急」的,它會很急切的進行表功,報告它找到的第一個符合 。

    正則導向的引擎總是返回最左邊的符合

這是需要你理解的很重要的一點:即使以後有可能發現一個「更好」的符合,正則導向的引擎也總是返回最左邊的符合。

當把<<cat>>應用到「He captured a catfish for his cat」,引擎先比較<<c>>和「H」,結果失敗了。於是引擎再比較<<c>>和「e」,也失敗了。直到第四個字元,<<c>>符合了「c」。<<a>>符合了第五個字元。到第六個字元<<t>>沒能符合「p」,也失敗了。引擎再繼續從第五個字元重新檢查符合性。直到第十五個字元開始,<<cat>>符合上了「catfish」中的「cat」,正則表達式引擎急切的返回第一個符合的結果,而不會再繼續尋找是否有其他更好的符合。

5.字集

字集是由一對方括號「[]」括起來的字集合。使用字集,你可以告訴正則表達式引擎僅僅符合多個字元中的一個。如果你想符合一個「a」或一個「e」,使用<<[ae]>>。你可以使用<<gr[ae]y>>符合gray或grey。這在你不確定你要搜尋的字元是採用美國英語還是英國英語時特別有用。相反,<<gr[ae]y>>將不會符合graay或graey。字集中的字元順序並沒有什麼關係,結果都是相同的。

你可以使用連字元「-」定義一個字元範圍作為字集。<<[0-9]>>符合0到9之間的單個數字。你可以使用不止一個範圍。<<[0-9a-fA-F] >>符合單個的十六進位數字,並且大小寫不敏感。你也可以結合範圍定義與單個字元定義。<<[0-9a-fxA-FX]>>符合一個十六進位數字或字母X。再次強調一下,字元和範圍定義的先後順序對結果沒有影響。

    字集的一些應用

尋找一個可能有拼字錯誤的單詞,比如<<sep[ae]r[ae]te>> 或 <<li[cs]en[cs]e>>。

尋找程式語系的標識符,<<A-Za-z_][A-Za-z_0-9]*>>。(*表示重複0或多次)

尋找C風格的十六進位數<<0[xX][A-Fa-f0-9]+>>。(+表示重複一次或多次)

    取反字集

在左方括號「[」後面緊跟一個尖括號「^」,將會對字集取反。結果是字集將符合任何不在方括號中的字元。不像「.」,取反字集是可以符合換行換行符的。

需要記住的很重要的一點是,取反字集必須要符合一個字元。<<q[^u]>>並不意味著:符合一個q,後面沒有u跟著。它意味著:符合一個q,後面跟著一個不是u的字元。所以它不會符合「Iraq」中的q,而會符合「Iraq is a country」中的q和一個空格符。事實上,空格符是符合中的一部分,因為它是一個「不是u的字元」。

如果你只想符合一個q,條件是q後面有一個不是u的字元,我們可以用後面將講到的向前檢視來解決。

    字集中的元字元

需要注意的是,在字集中只有4個 字元具有特殊含義。它們是:「] ^ -」。「]」代表字集定義的結束;「」代表轉義;「^」代表取反;「-」代表範圍定義。其他常見的元字元在字集定義內定都是標準字元,不需要轉義。例如,要搜尋星號*或加號+,你可以用<<[+*]>>。當然,如果你對那些通常的元字元進行轉義,你的正則表達式一樣會工作得很好,但是這會降低可讀性。

在字集定義中為了將反斜槓「」作為一個文字字元而非特殊含義的字元,你需要用另一個反斜槓對它進行轉義。<<[x]>>將會符合一個反斜槓和一個X。「]^-」都可以用反斜槓進行轉義,或是將他們放在一個不可能使用到他們特殊含義的位置。我們推薦後者,因為這樣可以增加可讀性。比如對於字元「^」,將它放在除了左括號「[」後面的位置,使用的都是文字字元含義而非取反含義。如<<[x^]>>會符合一個x或^。<<[]x]>>會符合一個「]」或「x」。<<[-x]>>或<<[x-]>>都會符合一個「-」或「x」。

    字集的簡寫

因為一些字集非常常用,所以有一些簡寫模式。

<<d>>代表<<[0-9]>>;

<<w>>代表單詞字元。這個是隨正則表達式實現的不同而有些差異。絕大多數的正則表達式實現的單詞字集都包括了<<A-Za-z0-9_]>>。

<<s>>代表「白字元」。這個也是和不同的實現有關的。在絕大多數的實現中,都包括了空格符和Tab符,以及換行換行符<<
>>。

字集的縮寫形式可以用在方括號之內或之外。<<sd>>符合一個白字元後面緊跟一個數字。<<[sd]>>符合單個白字元或數字。<<[da-fA-F]>>將符合一個十六進位數字。

取反字集的簡寫

<<[S]>> = <<[^s]>>

<<[W]>> = <<[^w]>>

<<[D]>> = <<[^d]>>

    字集的重複

如果你用「?*+」操作符來重複一個字集,你將會重複整個字集。而不僅是它符合的那個字元。正則表達式<<[0-9]+>>會符合837以及222。

如果你僅僅想重複被符合的那個字元,可以用向後引用達到目的。我們以後將講到向後引用。

6.使用?*或+ 進行重複

?:告訴引擎符合前導字元0次或一次。事實上是表示前導字元是可選的。

+:告訴引擎符合前導字元1次或多次

*:告訴引擎符合前導字元0次或多次

<[A-Za-z][A-Za-z0-9]*>符合沒有屬性的HTML標籤,「<」以及「>」是文字元號。第一個字集符合一個字母,第二個字集符合一個字母或數字。

我們似乎也可以用<[A-Za-z0-9]+>。但是它會符合<1>。但是這個正則表達式在你知道你要搜尋的字串不包括類似的無效標籤時還是足夠有效的。

    限制性重複

許多現代的正則表達式實現,都容許你定義對一個字元重複多少次。詞法是:{min,max}。min和max都是非負整數。如果逗號有而max被忽略了,則max沒有限制。如果逗號和max都被忽略了,則重複min次。

因此{0,}和*一樣,{1,}和+ 的作用一樣。

你可以用<<[1-9][0-9]{3}>>符合1000~9999之間的數字(「」表示單詞邊界)。<<[1-9][0-9]{2,4}>>符合一個在100~99999之間的數字。

    注意貪婪性

假設你想用一個正則表達式符合一個HTML標籤。你知道輸入將會是一個有效的HTML檔案,因此正則表達式不需要排除那些無效的標籤。所以如果是在兩個尖括號之間的內容,就應該是一個HTML標籤。

許多正則表達式的新手會首先想到用正則表達式<< <.+> >>,他們會很驚訝的發現,對於測試字串,「This is a <EM>first</EM> test」,你可能期望會返回<EM>,然後繼續進行符合的時候,返回</EM>。

但事實是不會。正則表達式將會符合「<EM>first</EM>」。很顯然這不是我們想要的結果。原因在於「+」是貪婪的。也就是說,「+」會導致正則表達式引擎試圖盡可能的重複前導字元。只有當這種重複會引起整個正則表達式符合失敗的情況下,引擎會進行回溯。也就是說,它會放棄最後一次的「重複」,然後處理正則表達式餘下的部分。

和「+」類似,「?*」的重複也是貪婪的。

    深入正則表達式引擎內定

讓我們來看看正則引擎如何符合前面的例子。第一個記號是「<」,這是一個文字元號。第二個符號是「.」,符合了字元「E」,然後「+」一直可以符合其餘的字元,直到一行的結束。然後到了換行符,符合失敗(「.」不符合換行符)。於是引擎開始對下一個正則表達式符號進行符合。也即試圖符合「>」。到目前為止,「<.+」已經符合了「<EM>first</EM> test」。引擎會試圖將「>」與換行符進行符合,結果失敗了。於是引擎進行回溯。結果是現在「<.+」符合「<EM>first</EM> tes」。於是引擎將「>」與「t」進行符合。顯然還是會失敗。這個過程繼續,直到「<.+」符合「<EM>first</EM」,「>」與「>」符合。於是引擎找到了一個符合「<EM>first</EM>」。記住,正則導向的引擎是「急切的」,所以它會急著報告它找到的第一個符合。而不是繼續回溯,即使可能會有更好的符合,例如「<EM>」。所以我們可以看到,由於「+」的貪婪性,使得正則表達式引擎返回了一個最左邊的最長的符合。

    用懶惰性取代貪婪性

一個用於修正以上問題的可能專案是用「+」的惰性代替貪婪性。你可以在「+」後面緊跟一個問號「?」來達到這一點。「*」,「{}」和「?」表示的重複也可以用這個專案。因此在上面的例子中我們可以使用「<.+?>」。讓我們再來看看正則表達式引擎的處理過程。

再一次,正則表達式記號「<」會符合字串的第一個「<」。下一個正則記號是「.」。這次是一個懶惰的「+」來重複上一個字元。這告訴正則引擎,盡可能少的重複上一個字元。因此引擎符合「.」和字元「E」,然後用「>」符合「M」,結果失敗了。引擎會進行回溯,和上一個例子不同,因為是惰性重複,所以引擎是延伸惰性重複而不是減少,於是「<.+」現在被延伸為「<EM」。引擎繼續符合下一個記號「>」。這次得到了一個完成符合。引擎於是報告「<EM>」是一個完成的符合。整個過程大致如此。

    惰性延伸的一個替代專案

我們還有一個更好的替代專案。可以用一個貪婪重複與一個取反字集:「<[^>]+>」。之所以說這是一個更好的專案在於使用惰性重複時,引擎會在找到一個完成符合前對每一個字元進行回溯。而使用取反字集則不需要進行回溯。

最後要記住的是,本教學僅僅談到的是正則導向的引擎。文字導向的引擎是不回溯的。但是同時他們也不支援惰性重複操作。

7.使用「.」符合幾乎任意字元

在正則表達式中,「.」是最常用的符號之一。不幸的是,它也是最容易被誤用的符號之一。

「.」符合一個單個的字元而不用關心被符合的字元是什麼。唯一的例外是新行符。在本教學中談到的引擎,預設情況下都是不符合新行符的。因此在預設情況下,「.」等於是字集[^

](Window)或[^
]( Unix)的簡寫。

這個例外是因為歷史的原因。因為早期使用正則表達式的工具是基於行的。它們都是一行一行的讀入一個檔案,將正則表達式分別應用到每一行上去。在這些工具中,字串是不包括新行符的。因此「.」也就永遠不符合新行符。

現代的工具和語系能夠將正則表達式應用到很大的字串甚至整個檔案上去。本教學討論的所有正則表達式實現都提供一個選項,可以使「.」符合所有的字元,內含新行符。在RegexBuddy, EditPad Pro或PowerGREP等工具中,你可以簡單的選中「點號符合新行符」。在Perl中,「.」可以符合新行符的模式被稱作「單行模式」。很不幸,這是一個很容易混淆的名詞。因為還有所謂「多行模式」。多行模式只影響行首行尾的錨定(anchor),而單行模式只影響「.」。

其他語系和正則表達式庫也採用了Perl的術語定義。當在.NET Framework中使用正則表達式類時,你可以用類似下面的語句來啟動單行模式:Regex.Match(「string」,」regex」,RegexOptions.SingleLine)

    保守的使用點號「.」

點號可以說是最強大的元字元。它容許你偷懶:用一個點號,就能符合幾乎所有的字元。但是問題在於,它也常常會符合不該符合的字元。

我會以一個簡單的例子來說明。讓我們看看如何符合一個具有「mm/dd/yy」格式的日期,但是我們想容許使用者來選取分隔設定。很快能想到的一個專案是<<dd.dd.dd>>。看上去它能符合日期「02/12/03」。問題在於02512703也會被認為是一個有效的日期。

<<dd[-/.]dd[-/.]dd>>看上去是一個好一點的解決專案。記住點號在一個字集裡不是元字元。這個專案遠不夠完善,它會符合「99/99/99」。而<<[0-1]d[-/.][0-3]d[-/.]dd>>又更進一步。儘管他也會符合「19/39/99」。你想要你的正則表達式達到如何完美的程度取決於你想達到什麼樣的目的。如果你想校驗使用者輸入,則需要盡可能的完美。如果你只是想分析一個已知的源,並且我們知道沒有錯誤的資料,用一個比較好的正則表達式來符合你想要搜尋的字元就已經足夠。

 

8.字串開始和結束的錨定

錨定和一般的正則表達式符號不同,它不符合任何字元。相反,他們符合的是字元之前或之後的位置。「^」符合一行字串第一個字元前的位置。<<^a>>將會符合字串「abc」中的a。<<^b>>將不會符合「abc」中的任何字元。

類似的,$符合字串中最後一個字元的後面的位置。所以<<c$>>符合「abc」中的c。

    錨定的應用

在寫程式語系中校驗使用者輸入時,使用錨定是非常重要的。如果你想校驗使用者的輸入為整數,用<<^d+$>>。

使用者輸入中,常常會有多餘的前導空格或結束空格。你可以用<<^s*>>和<<s*$>>來符合前導空格或結束空格。

    使用「^」和「$」作為行的開始和結束錨定

如果你有一個包括了多行的字串。例如:「first line

second line」(其中

表示一個新行符)。常常需要對每行分別處理而不是整個字串。因此,幾乎所有的正則表達式引擎都提供一個選項,可以延伸這兩種錨定的含義。「^」可以符合字串的開始位置(在f之前),以及每一個新行符的後面位置(在

和s之間)。類似的,$會符合字串的結束位置(最後一個e之後),以及每個新行符的前面(在e與

之間)。

在.NET中,當你使用如下代碼時,將會定義錨定符合每一個新行符的前面和後面位置:Regex.Match(「string」, 「regex」, RegexOptions.Multiline)

應用:string str = Regex.Replace(Original, 「^」, 「> 「, RegexOptions.Multiline)–將會在每行的行首插入「> 」。

    絕對錨定

<<A>>只符合整個字串的開始位置,<<>>只符合整個字串的結束位置。即使你使用了「多行模式」,<<A>>和<<>>也永遠不符合新行符。

即使和$只符合字串的結束位置,仍然有一個例外的情況。如果字串以新行符結束,則和$將會符合新行符前面的位置,而不是整個字串的最後面。這個「改進」是由Perl引進的,然後被許多的正則表達式實現所遵循,內含Java,.NET等。如果應用<<^[a-z]+$>>到「joe
」,則符合結果是「joe」而不是「joe
」。

9.單詞邊界

元字元<<>>也是一種對位置進行符合的「錨」。這種符合是0長度符合。

有4種位置被認為是「單詞邊界」:

1)  在字串的第一個字元前的位置(如果字串的第一個字元是一個「單詞字元」)

2)  在字串的最後一個字元後的位置(如果字串的最後一個字元是一個「單詞字元」)

3)  在一個「單詞字元」和「非單詞字元」之間,其中「非單詞字元」緊跟在「單詞字元」之後

4)  在一個「非單詞字元」和「單詞字元」之間,其中「單詞字元」緊跟在「非單詞字元」後面

「單詞字元」是可以用「w」符合的字元,「非單詞字元」是可以用「W」符合的字元。在大多數的正則表達式實現中,「單詞字元」通常內含<<[a-zA-Z0-9_]>>。

例如:<<4>>能夠符合單個的4而不是一個更大數的一部分。這個正則表達式不會符合「44」中的4。

換種說法,幾乎可以說<<>>符合一個「字母數字序列」的開始和結束的位置。

「單詞邊界」的取反集為<<B>>,他要符合的位置是兩個「單詞字元」之間或是兩個「非單詞字元」之間的位置。

    深入正則表達式引擎內定

讓我們看看把正則表達式<<is>>應用到字串「This island is beautiful」。引擎先處理符號<<>>。因為是0長度 ,所以第一個字元T前面的位置會被考察。因為T是一個「單詞字元」,而它前面的字元是一個空字元(void),所以符合了單詞邊界。接著<<i>>和第一個字元「T」符合失敗。符合過程繼續進行,直到第五個空格符,和第四個字元「s」之間又符合了<<>>。然而空格符和<<i>>不符合。繼續向後,到了第六個字元「i」,和第五個空格字元之間符合了<<>>,然後<<is>>和第六、第七個字元都符合了。然而第八個字元和第二個「單詞邊界」不符合,所以符合又失敗了。到了第13個字元i,因為和前面一個空格符形成「單詞邊界」,同時<<is>>和「is」符合。引擎接著嘗試符合第二個<<>>。因為第15個空格符和「s」形成單詞邊界,所以符合完成。引擎「急著」返回完成符合的結果。

10.  選取符

正則表達式中「|」表示選取。你可以用選取符符合多個可能的正則表達式中的一個。

如果你想搜尋文字「cat」或「dog」,你可以用<<cat|dog>>。如果你想有更多的選取,你只要延伸清單<<cat|dog|mouse|fish>>。

選取符在正則表達式中具有最低的優先級,也就是說,它告訴引擎要麼符合選取符左邊的所有表達式,要麼符合右邊的所有表達式。你也可以用圓括號來限制選取符的作用範圍。如<<(cat|dog)>>,這樣告訴正則引擎把(cat|dog)當成一個正則表達式單位來處理。

    注意正則引擎的「急於表功」性

正則引擎是急切的,當它找到一個有效的符合時,它會停止搜尋。因此在一定條件下,選取符兩邊的表達式的順序對結果會有影響。假設你想用正則表達式搜尋一個寫程式語系的函數清單:Get,GetValue,Set或SetValue。一個明顯的解決專案是<<Get|GetValue|Set|SetValue>>。讓我們看看當搜尋SetValue時的結果。

因為<<Get>>和<<GetValue>>都失敗了,而<<Set>>符合完成。因為正則導向的引擎都是「急切」的,所以它會返回第一個完成的符合,就是「Set」,而不去繼續搜尋是否有其他更好的符合。

和我們期望的相反,正則表達式並沒有符合整個字串。有幾種可能的解決辦法。一是考慮到正則引擎的「急切」性,改變選項的順序,例如我們使用<<GetValue|Get|SetValue|Set>>,這樣我們就可以優先搜尋最長的符合。我們也可以把四個選項結合起來成兩個選項:<<Get(Value)?|Set(Value)?>>。因為問號重複符是貪婪的,所以SetValue總會在Set之前被符合。

一個更好的專案是使用單詞邊界:<<(Get|GetValue|Set|SetValue)>>或<<(Get(Value)?|Set(Value)?>>。更進一步,既然所有的選取都有相同的結尾,我們可以把正則表達式改善為<<(Get|Set)(Value)?>>。

11.  組與向後引用

把正則表達式的一部分放在圓括號內,你可以將它們形成組。然後你可以對整個組使用一些正則操作,例如重複操作符。

要注意的是,只有圓括號「()」才能用於形成組。「[]」用於定義字集。「{}」用於定義重複操作。

當用「()」定義了一個正則表達式組後,正則引擎則會把被符合的組按照順序編號,存入快取。當對被符合的組進行向後引用的時候,可以用「數字」的模式進行引用。<<1>>引用第一個符合的後向引用組,<<2>>引用第二個組,以此類推,<<
>>引用第n個組。而<< >>則引用整個被符合的正則表達式本身。我們看一個例子。

假設你想符合一個HTML標籤的開始標籤和結束標籤,以及標籤中間的文字。比如<B>This is a test</B>,我們要符合<B>和</B>以及中間的文字。我們可以用如下正則表達式:「<([A-Z][A-Z0-9]*)[^>]*>.*?</1>」

首先,「<」將會符合「<B>」的第一個字元「<」。然後[A-Z]符合B,[A-Z0-9]*將會符合0到多次字母數字,後面緊接著0到多個非「>」的字元。最後正則表達式的「>」將會符合「<B>」的「>」。接下來正則引擎將對結束標籤之前的字元進行惰性符合,直到遇到一個「</」符號。然後正則表達式中的「1」表示對前面符合的組「([A-Z][A-Z0-9]*)」進行引用,在本例中,被引用的是標籤名「B」。所以需要被符合的結尾標籤為「</B>」

你可以對相同的後向引用組進行多次引用,<<([a-c])x1x1>>將符合「axaxa」、「bxbxb」以及「cxcxc」。如果用數字形式引用的組沒有有效的符合,則引用到的內容簡單的為空。

一個後向引用不能用於它自身。<<([abc]1)>>是錯誤的。因此你不能將<< >>用於一個正則表達式符合本身,它只能用於置換操作中。

後向引用不能用於字集內定。<<(a)[1b]>>中的<<1>>並不表示後向引用。在字集內定,<<1>>可以被解釋為八進位形式的轉碼。

向後引用會降低引擎的速度,因為它需要存儲符合的組。如果你不需要向後引用,你可以告訴引擎對某個組不存儲。例如:<<Get(?:Value)>>。其中「(」後面緊跟的「?:」會告訴引擎對於組(Value),不存儲符合的值以供後向引用。

    重複操作與後向引用

當對組使用重複操作符時,快取裡後向引用內容會被不斷重整,只保留最後符合的內容。例如:<<([abc]+)=1>>將符合「cab=cab」,但是<<([abc])+=1>>卻不會。因為([abc])第一次符合「c」時,「1」代表「c」;然後([abc])會繼續符合「a」和「b」。最後「1」代表「b」,所以它會符合「cab=b」。

應用:檢查重複單詞–當編輯文字時,很容易就會輸入重複單詞,例如「the the」。使用<<(w+)s+1>>可以檢驗到這些重複單詞。要刪除第二個單詞,只要簡單的利用置換功能置換掉「1」就可以了。

    組的命名和引用

在PHP,Python中,可以用<<(?P<name>group)>>來對組進行命名。在本例中,詞法?P<name>就是對組(group)進行了命名。其中name是你對組的起的名字。你可以用(?P=name)進行引用。

.NET的命名組

.NET framework也支援命名組。不幸的是,微軟的程式員們決定發明他們自己的語法,而不是沿用Perl、Python的規則。目前為止,還沒有任何其他的正則表達式實現支援微軟發明的語法。

下面是.NET中的例子:

(?<first>group)(?』second』group)

正如你所看到的,.NET提供兩種詞法來建立命名組:一是用尖括號「<>」,或是用單引號「』』」。尖括號在字串中使用更方便,單引號在ASP代碼中更有用,因為ASP代碼中「<>」被用作HTML標籤。

要引用一個命名組,使用k<name>或k』name』.

當進行搜尋置換時,你可以用「${name}」來引用一個命名組。

12.  正則表達式的符合模式

本教學所討論的正則表達式引擎都支援三種符合模式:

<</i>>使正則表達式對大小寫不敏感,

<</s>>開啟「單行模式」,即點號「.」符合新行符

<</m>>開啟「多行模式」,即「^」和「$」符合新行符的前面和後面的位置。

    在正則表達式內定開啟或關閉模式

如果你在正則表達式內定插入修飾符(?ism),則該修飾符只對其右邊的正則表達式起作用。(?-i)是關閉大小寫不敏感。你可以很快的進行測試。<<(?i)te(?-i)st>>應該符合TEst,但是不能符合teST或TEST.

13.  原子組與防止回溯

在一些特殊情況下,因為回溯會使得引擎的效率極其低下。

讓我們看一個例子:要符合這樣的字串,字串中的每個欄位間用逗號做分隔設定,第12個欄位由P開頭。

我們容易想到這樣的正則表達式<<^(.*?,){11}P>>。這個正則表達式在標準情況下工作的很好。但是在極端情況下,如果第12個欄位不是由P開頭,則會發生災難性的回溯。如要搜尋的字串為「1,2,3,4,5,6,7,8,9,10,11,12,13」。首先,正則表達式一直完成符合直到第12個字元。這時,前面的正則表達式消耗的字串為「1,2,3,4,5,6,7,8,9,10,11,」,到了下一個字元,<<P>>並不符合「12」。所以引擎進行回溯,這時正則表達式消耗的字串為「1,2,3,4,5,6,7,8,9,10,11」。繼續下一次符合過程,下一個正則符號為點號<<.>>,可以符合下一個逗號「,」。然而<<,>>並不符合字元「12」中的「1」。符合失敗,繼續回溯。大家可以想像,這樣的回溯組合是個非常大的數量。因此可能會造成引擎崩潰。

用於阻止這樣巨大的回溯有幾種專案:

一種簡單的專案是盡可能的使符合精確。用取反字集代替點號。例如我們用如下正則表達式<<^([^,
]*,){11}P>>,這樣可以使失敗回溯的次數下降到11次。

另一種專案是使用原子組。

原子組的目的是使正則引擎失敗的更快一點。因此可以有效的阻止海量回溯。原子組的語法是<<(?>正則表達式)>>。位於(?>)之間的所有正則表達式都會被認為是一個單一的正則符號。一旦符合失敗,引擎將會回溯到原子組前面的正則表達式部分。前面的例子用原子組可以表達成<<^(?>(.*?,){11})P>>。一旦第十二個欄位符合失敗,引擎回溯到原子組前面的<<^>>。

14.  向前檢視與向後檢視

Perl 5 引入了兩個強大的正則語法:「向前檢視」和「向後檢視」。他們也被稱作「零長度斷言」。他們和錨定一樣都是零長度的(所謂零長度即指該正則表達式不消耗被符合的字串)。不同之處在於「前後檢視」會實際符合字元,只是他們會拋棄符合只返回符合結果:符合或不符合。這就是為什麼他們被稱作「斷言」。他們並不實際消耗字串中的字元,而只是斷言一個符合是否可能。

幾乎本文討論的所有正則表達式的實現都支援「向前嚮後檢視」。唯一的一個例外是Javascript只支援向前檢視。

    肯定和否定式的向前檢視

如我們前面提過的一個例子:要尋找一個q,後面沒有緊跟一個u。也就是說,要麼q後面沒有字元,要麼後面的字元不是u。採用否定式向前檢視後的一個解決專案為<<q(?!u)>>。否定式向前檢視的語法是<<(?!檢視的內容)>>。

肯定式向前檢視和否定式向前檢視很類似:<<(?=檢視的內容)>>。

如果在「檢視的內容」部分有組,也會產生一個向後引用。但是向前檢視本身並不會產生向後引用,也不會被計入向後引用的編號中。這是因為向前檢視本身是會被拋棄掉的,只保留符合與否的判斷結果。如果你想保留符合的結果作為向後引用,你可以用<<(?=(regex))>>來產生一個向後引用。

    肯定和否定式的先後檢視

向後檢視和向前檢視有相同的效果,只是方向相反

否定式向後檢視的語法是:<<(?<!檢視內容)>>

肯定式向後檢視的語法是:<<(?<=檢視內容)>>

我們可以看到,和向前檢視相比,多了一個表示方向的左尖括號。

例:<<(?<!a)b>>將會符合一個沒有「a」作前導字元的「b」。

值得注意的是:向前檢視從現用的字串位置開始對「檢視」正則表達式進行符合;向後檢視則從現用的字串位置開始先後回溯一個字元,然後再開始對「檢視」正則表達式進行符合。

    深入正則表達式引擎內定

讓我們看一個簡單例子。

把正則表達式<<q(?!u)>>應用到字串「Iraq」。正則表達式的第一個符號是<<q>>。正如我們知道的,引擎在符合<<q>>以前會掃過整個字串。當第四個字元「q」被符合後,「q」後面是空字元(void)。而下一個正則符號是向前檢視。引擎注意到已經進入了一個向前檢視正則表達式部分。下一個正則符號是<<u>>,和空字元不符合,從而導致向前檢視裡的正則表達式符合失敗。因為是一個否定式的向前檢視,意味著整個向前檢視結果是完成的。於是符合結果「q」被返回了。

我們在把相同的正則表達式應用到「quit」。<<q>>符合了「q」。下一個正則符號是向前檢視部分的<<u>>,它符合了字串中的第二個字元「i」。引擎繼續走到下個字元「i」。然而引擎這時注意到向前檢視部分已經處理完了,並且向前檢視已經完成。於是引擎拋棄被符合的字串部分,這將導致引擎回退到字元「u」。

因為向前檢視是否定式的,意味著檢視部分的完成符合導致了整個向前檢視的失敗,因此引擎不得不進行回溯。最後因為再沒有其他的「q」和<<q>>符合,所以整個符合失敗了。

為了確保你能清楚地理解向前檢視的實現,讓我們把<<q(?=u)i>>應用到「quit」。<<q>>首先符合「q」。然後向前檢視完成符合「u」,符合的部分被拋棄,只返回可以符合的判斷結果。引擎從字元「i」回退到「u」。由於向前檢視完成了,引擎繼續處理下一個正則符號<<i>>。結果發現<<i>>和「u」不符合。因此符合失敗了。由於後面沒有其他的「q」,整個正則表達式的符合失敗了。

    更進一步理解正則表達式引擎內定機制

讓我們把<<(?<=a)b>>應用到「thingamabob」。引擎開始處理向後檢視部分的正則符號和字串中的第一個字元。在這個例子中,向後檢視告訴正則表達式引擎回退一個字元,然後檢視是否有一個「a」被符合。因為在「t」前面沒有字元,所以引擎不能回退。因此向後檢視失敗了。引擎繼續走到下一個字元「h」。再一次,引擎暫時回退一個字元並檢查是否有個「a」被符合。結果發現了一個「t」。向後檢視又失敗了。

向後檢視繼續失敗,直到正則表達式到達了字串中的「m」,於是肯定式的向後檢視被符合了。因為它是零長度的,字串的現用的位置仍然是「m」。下一個正則符號是<<b>>,和「m」符合失敗。下一個字元是字串中的第二個「a」。引擎向後暫時回退一個字元,並且發現<<a>>不符合「m」。

在下一個字元是字串中的第一個「b」。引擎暫時性的向後退一個字元發現向後檢視被滿足了,同時<<b>>符合了「b」。因此整個正則表達式被符合了。作為結果,正則表達式返回字串中的第一個「b」。

    向前嚮後檢視的應用

我們來看這樣一個例子:尋找一個具有6位字元的,含有「cat」的單詞。

首先,我們可以不用向前嚮後檢視來解決問題,例如:

<< catw{3}|wcatw{2}|w{2}catw|w{3}cat>>

足夠簡單吧!但是當需求變成尋找一個具有6-12位字元,含有「cat」,「dog」或「mouse」的單詞時,這種方法就變得有些笨拙了。

我們來看看使用向前檢視的專案。在這個例子中,我們有兩個基本需求要滿足:一是我們需要一個6位的字元,二是單詞含有「cat」。

滿足第一個需求的正則表達式為<<w{6}>>。滿足第二個需求的正則表達式為<<w*catw*>>。

把兩者結合起來,我們可以得到如下的正則表達式:

<<(?=w{6})w*catw*>>

具體的符合過程留給讀者。但是要注意的一點是,向前檢視是不消耗字元的,因此當判斷單詞滿足具有6個字元的條件後,引擎會從開始判斷前的位置繼續對後面的正則表達式進行符合。

最後作些改善,可以得到下面的正則表達式:

<<(?=w{6})w{0,3}catw*>>

15.  正則表達式中的條件測試

條件測試的語法為<<(?ifthen|else)>>。「if」部分可以是向前嚮後檢視表達式。如果用向前檢視,則語法變為:<<(?(?=regex)then|else)>>,其中else部

分是可選的。

如果if部分為true,則正則引擎會試圖符合then部分,否則引擎會試圖符合else部分。

需要記住的是,向前先後檢視並不實際消耗任何字元,因此後面的then與else部分的符合時從if測試前的部分開始進行嘗試。

16.  為正則表達式加入註釋

在正則表達式中加入註釋的語法是:<<(?#comment)>>

例:為用於符合有效日期的正則表達式加入註釋:

(?#year)(19|20)dd[- /.](?#month)(0[1-9]|1[012])[- /.](?#day)(0[1-9]|[12][0-9]|3[01])
原文出處:http://imsiren.com/archives/560

PHP程式設計問題諮詢:
請什麼是UBB代碼?使用UBB代碼有何好處?

PHP程式設計問題回覆:
UBB代碼,可以參考以下的說明:

UBB代碼是HTML的一個變種,是Ultimate Bulletin Board (國外一個BBS程式,國內也有不少地方使用這個程式)採用的一種特殊的TAG.
即使禁止使用 HTML,你也可以用 UBBCode? 來實現.也許你更希望使用 UBBCode? 而不是 HTML, 即使論壇允許使用 HTML, 因為使用起來代碼較少也更安全.

PHP攫取代碼案例,支援正則表達式設定從開始到結束區功能變數,代碼如下:

<?php     
function preg_substr($start, $end, $str) // 正則截取函數     
{     
    $temp = preg_split($start, $str);     
    $content = preg_split($end, $temp[1]);     
    return $content[0];     
}  
function str_substr($start, $end, $str) // 字串截取函數     
{     
    $temp = explode($start, $str, 2);     
    $content = explode($end, $temp[1], 2);     
    return $content[0];     
}  
// —————- 使用案例 —————-  
$str = iconv("UTF-8", "big5", file_get_contents("http://www.mycodes.net"));   
echo ('標題: ' . str_substr("<title>", "</title>", $str)); // 通過字串提取標題  
echo ('作者: ' . preg_substr("/userid=d+">/", "/<//", $str)); // 通過正則提取作者  
echo ('內容: ' . str_substr('<div class="content">', '</div>', $str)); //內容當然不可以少  
?>   

FPDF的功能確實很強大,但它是如何實現PDF檔案生成的呢,我決定深入分析一下它的代碼,以求對其進行改進,應用到自己的項目中。

FPDF實際上是一個類,由於該類在php4和5下都能標準運行,那麼就從PHP4的角度來分析它。
首先從類的屬性、構造函數開始,然後按類的公共方法的順序進行分析,遇到呼叫其他方法的時候將其提前進行分析。

首先來看類的屬性:
var $page;               // 現用的頁數    
var $n;                  // 現用的對像數    
var $offsets;            //array of object offsets    
var $buffer;             // PDF 快取    
var $pages;              // 包括頁數的陣列    
var $state;              // 現用的文件狀態    
var $compress;           // 壓縮標示    
var $k;                  // 比例因子(使用者指定單位內的點)    
var $DefOrientation;     // 預設方向    
var $CurOrientation;     // 現用的方向    
var $PageFormats;        // 可用的頁格式    
var $DefPageFormat;      // 預設的頁格式    
var $CurPageFormat;      // 現用的的頁格式    
var $PageSizes;          // 儲存非預設頁面大小的陣列    
var $wPt,$hPt;           // 用點表示的現用的頁尺寸    
var $w,$h;               // 使用者指定單位表示的現用的頁尺寸    
var $lMargin;            // 頁面左邊距    
var $tMargin;            // 頁面上邊距    
var $rMargin;            // 頁面右邊距    
var $bMargin;            // 換版邊    
var $cMargin;            // 內定單元邊距    
var $x,$y;               // 使用者單位表示的現用的坐標    
var $lasth;              // 最近輸出單元的高度    
var $LineWidth;          // 使用者單位表示的線寬,即粗細    
var $CoreFonts;          // 標準字型名稱的陣列    
var $fonts;              // 用到的字型的陣列    
var $FontFiles;          // 字型檔案的陣列    
var $diffs;              // 編碼差異的陣列    
var $FontFamily;         // 現用的字型    
var $FontStyle;          // 現用的字型樣式    
var $underline;          // 下劃線標示    
var $CurrentFont;        // 現用的字型訊息    
var $FontSizePt;         // 用點表示現用的字型大小    
var $FontSize;           // 使用者單位表示現用的字型大小    
var $DrawColor;          // 繪圖彩色指令    
var $FillColor;          // 填充彩色指令    
var $TextColor;          // 文字彩色指令    
var $ColorFlag;          // 指出填充彩色和文字彩色是否不同    
var $ws;                 // 文字間距    
var $images;             // 用到的圖片的陣列    
var $PageLinks;          // 頁面連結的陣列    
var $links;              // 內定連結的陣列    
var $AutoPageBreak;      // 自動分頁    
var $PageBreakTrigger;   // 自動分頁的觸發值,即最大內容高度    
var $InHeader;           // 處理頁眉時的標示    
var $InFooter;           // 處理頁腳時的標示    
var $ZoomMode;           // 顯示時的縮放模式    
var $LayoutMode;         // 分頁顯示模式    
var $title;              // 檔案標題    
var $subject;            // 檔案主旨    
var $author;             // 檔案作者    
var $keywords;           // 檔案關鍵詞    
var $creator;            // 應用程式,不知道啥意思,PDF屬性裡的    
var $AliasNbPages;       // 頁面總數的別名,用於在該位置顯示頁面總數    
var $PDFVersion;         // PDF 版本號  

這裡把註釋換成了中文的,僅供參考吧!

在網站PHP程式網頁中,如何生成靜態頁面的方法?

在PHP網站開發中為了網站推廣和SEO等需要,需要對網站進行全站或局部靜態化處理,PHP生成靜態HTML頁面有多種方法,比如利用PHP範本、快取等實現頁面靜態化,今天就以PHP案例教學形式討論PHP生成靜態頁面的方法。頁面靜態化的方法,分為兩種,一種是偽靜態,就是url 重寫,一種是你真的靜態化。下面介紹PHP中頁面靜態化的方法。

什麼是PHP靜態化

PHP靜態化的簡單理解就是使網站生成頁面以靜態HTML的形式展現在訪客面前,PHP靜態化分純靜態化和偽靜態化,兩者的區別在於PHP生成靜態頁面的處理機制不同。

PHP生成靜態HTML頁面的方法

1、利用PHP範本生成靜態頁面

PHP範本實現靜態化非常方便,比如安裝和使用PHP Smarty實現網站靜態化。

2、使用PHP檔案讀寫功能生成靜態頁面

PHP生成靜態頁面案例代碼

    <?
    $out1 = "<html><head><title>PHP網站靜態化教學</title></head>
    <body>歡迎訪問PHP網站開發教學網http://por.tw,本文主要介紹PHP網站頁面靜態化的方法
    </body></html>";
    $fp = fopen("leapsoulcn.html","w");
    if(!$fp)
    {
    echo "System Error";
    exit();
    }
    else {
    fwrite($fp,$out1);
    fclose($fp);
    echo "Success";
    }
    ?>

    3、使用PHP輸出控制函數(Output Control)生成靜態頁面

    輸出控制函數(Output Control)也就是使用和控制快取來生成靜態HTML頁面,也會使用到PHP檔案讀寫函數。

    PHP生成靜態頁面案例代碼
        <?
        ob_start();
        echo "<html>".
        "<head>".
        "<title>PHP網站靜態化教學</title>".
        "</head>".
        "<body>歡迎訪問PHP網站開發教學網http://por.tw,本文主要介紹PHP網站頁面靜態化的方法</body>".
        "</html>";
        $out1 = ob_get_contents();
        ob_end_clean();
        $fp = fopen("leapsoulcn.html","w");
        if(!$fp)
        {
        echo "System Error";
        exit();
        }
        else
        {
        fwrite($fp,$out1);
        fclose($fp);
        echo "Success";
        }
        ?>

        我們知道使用PHP進行網站開發,一般執行結果直接輸出到遊覽器,為了使用PHP生成靜態頁面,就需要使用輸出控制函數控制快取區,以便取得快取區的內容,然後再輸出到靜態HTML頁面檔案中以實現網站靜態化。

        PHP生成靜態頁面的思路為:首先開啟快取,然後輸出了HTML內容(你也可以通過include將HTML內容以檔案形式包括進來),之後取得快取中的內容,清理快取後通過PHP檔案讀寫函數將快取內容寫入到靜態HTML頁面檔案中。PHP檔案讀寫教學?

        獲得輸出的快取內容以生成靜態HTML頁面的過程需要使用三個函數:ob_start()、ob_get_contents()、ob_end_clean()。

        網站PHP程式網頁生成靜態頁面的方法知識點:

        1、ob_start函數一般主要是用來開啟快取,注意使用ob_start之前不能有任何輸出,如空格、字元等。

        2、ob_get_contents函數主要用來取得快取中的內容以字串形式返回,注意此函數必須在ob_end_clean函數之前呼叫,否則取得不到快取內容。

        3、ob_end_clean函數主要是清理快取中的內容並關閉快取,完成則返回True,失敗則返回False

        PHP輸出控制函數(Output Control)有很多應用,今後將陸續展開。

        至此,使用PHP生成靜態HTML頁面以實現網站靜態化的方法就介紹完了,根據實際情況和需求你可以選取不同的靜態化方法。

用php生成UTF-8的檔案沒有什麼特別的,只要把我們執行的那個PHP檔案改成UTF-8編碼儲存起來,然後頁面內容也用UTF-8的編碼就可以了。

代碼如下:

header('Content-Type: text/html; charset=utf-8');
$text=」荊門線上 0724.CC 普通文字帶漢字生成」;
$f=fopen("0724.php", 「wb」);
fwrite($f, $text);
fclose($f);
?>

這樣雖然上面定義了utf-8生成的是 utf-8 的格式,我們來簡單的改下就可以了  因為這樣儲存的檔案在記事中檢視並不是utf-8的編碼,所以我們看下面代碼

$xml = '網路線上 普通文字帶中文字生成';
$h = fopen (0725.php,'w');
if ($h) {
  fwrite ($h,"xEFxBBxBF".iconv('utf-8','utf-8',$xml));
}
fclose ($h);

前面這個 xEFxBBxBF 一定不能忘記呀

OK,這時候生成的檔案就是我們要的 utf-8格式的編碼檔案。

網站發生警語:atal error: Allowed memory size of 16777216 bytes exhausted(記憶體不夠用)之處理方法

網站架站或網站升級後,網站發生類似警語:atal error: Allowed memory size of XXXXXXXX bytes exhausted
不管是管理介面(Dashboard),或者登入出問題,看來幾乎都是記憶體不夠用。

例如其發生的警語:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 4023 bytes)

這是什麼意思呢?又該如何解決?
答案是:記憶體的需求是更大了,這邊提供幾個解決的方法。

當出現以下的類似情況,要來調整PHP的記憶體,來執行更多的程式
1.找到php.ini的路徑(/etc/php5/apache2/php.ini)
2.搜尋:memory_limit 字串
3.找到:memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)

A.如果有權限修改php.ini,那麼請將memory_limit = 32M的32提高,看是要64還是96或者128。
    
B.如果沒有權限修改php.ini,可以在.htaccess裡面加上php_value memory_limit 32M,或者更高的數字。

備註:php.ini修改後apache要重新啟動才會生效!

語法如下:
service apache2 restart

————————————————————-

如何使用PHP執行linux系統指令呢?
相信這是很多學員想知道答案!

首先先要給大家介紹PHP執行linux系統指令的幾個基本函數。

system函數

說明:執行外部程式並顯示輸出資料。
語法:string system(string command, int [return_var]);
返回值: 字串

詳細介紹:
本函數就像是 C 語中的函數 system(),用來執行指令,並輸出結果。若是 return_var 參數存在,則執行 command 之後的狀態會填入 return_var 中。同樣值得注意的是若需要處理使用者輸入的資料,而又要防止使用者耍花招破解系統,則可以使用 EscapeShellCmd()。若 PHP 以模組式的執行,本函數會在每一行輸出後自動更新 Web 伺服器的輸出緩衝暫存區。若需要完整的返回字串,且不想經由不必要的其它中間的輸出介面,可以使用 PassThru()。

案例代碼:
< ?php
$last_line = system('ls', $retval);
echo 'Last line of the output: ' . $last_line;
echo '<hr />Return value: ' . $retval;
?>

exec函數
說明:執行外部程式。
語法:string exec(string command, string [array], int [return_var]);
返回值: 字串

詳細介紹:
本函數執行輸入 command 的外部程式或外部指令。
它的返回字串只是外部程式執行後返回的最後一行;若需要完整的返回字串,可以使用 PassThru() 這個函數。

要是參數 array 存在,command 會將 array 加到參數中執行,若不欲 array 被處理,可以在執行 exec() 之前呼叫 unset()。
若是 return_var 跟 array 二個參數都存在,則執行 command 之後的狀態會填入 return_var 中。

值得注意的是若需要處理使用者輸入的資料,而又要防止使用者耍花招破解系統,則可以使用 EscapeShellCmd()。

案例代碼:
<?php
echo exec('whoami');
?>  

popen函數
說明:開啟檔案。
語法:int popen(string command, string mode);
返回值: 整數

詳細介紹:
本函數執行指令開檔,而該檔案是用管道模式處理的檔案。
用本函數開啟的檔案只能是單向的 (只能讀或只能寫),而且一定要用 pclose() 關閉。
在檔案操作上可使用 fgets()、fgetss() 與 fputs()。若是開檔發生錯誤,返回 false 值。

案例代碼:
<?
$fp = popen( "/bin/ls", "r" );
?>  

資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量交易和傳輸的大量資料。
對於不需要復原為原始資料的訊息我們可以使用MD5、sha1等不可逆加密算法對資料進行加密處理,但對於交易訊息等需要復原為原始資料的重要訊息則必須使用可復原的加密算法進行加密了。
當然你可以自己寫一個可逆加密的算法進行加密和解密計算。
本文中我們介紹的是使用 mcrypt模組進行加密解密操作。

Mcrypt的優點不僅僅在於其提供的加密算法較多,在windows下隨PHP包一起發佈,還在於它可以對資料進行加/解密處理,此外,它還提供了內含DES算法在內的35種處理資料用的函數。
/**
 +—————————————————–
 * Mcrypt 加密/解密
 * @param String $date 要加密和解密的資料
 * @param String $mode encode 預設為加密/decode 為解密
 * @return String
 +—————————————————–
 * @example
 */
function ZxingCrypt($date,$mode = 'encode'){
    $key = md5('zxing');//用MD5哈希生成一個密鑰,注意加密和解密的密鑰必須統一
    if ($mode == 'decode'){
        $date = base64_decode($date);
    }
    if (function_exists('mcrypt_create_iv')){
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }
    if (isset($iv) && $mode == 'encode'){
        $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $date, MCRYPT_MODE_ECB, $iv);
    }elseif (isset($iv) && $mode == 'decode'){
        $passcrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $date, MCRYPT_MODE_ECB, $iv);
    }
    if ($mode == 'encode'){
        $passcrypt = base64_encode($passcrypt);
    }
    return $passcrypt;
}

—————————————————————-

隱藏apache和php的版本訊息可以盡量減少敏感訊息洩露的方法,並不會使你的伺服器真的更安全,如果你現在使用的版本比較舊,請務必盡快將系統升級,降低被蠕蟲攻擊的風險。

隱藏apache和php的版本訊息,web server避免一些不必要的麻煩,可以把apache和php的版本訊息不顯示

隱藏 Apache 版本訊息

/etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf

ServerTokens ProductOnly
ServerSignature Off

重啟 apache
現在 http 頭裡面只看到:
Server: Apache

隱藏 PHP 版本
php.ini

expose_php On
改成
expose_php Off

重啟apache後,php版本在http頭中隱藏了。

詳解 :

為了防止某些別有用心的傢伙窺視我們的伺服器,應該做些什麼.
我們來看一下關聯的2個參數,分別為ServerTokens和ServerSignature,通過控制這2個閥門應該就能起到一些作用,比如我們可以在配置檔案中這麼寫:
ServerTokens Prod
ServerSignature Off

ServerTokens
用於控制伺服器是否相應來自使用者端的請求,向使用者端輸出伺服器系統類型或內建模組等重要的系統訊息。 在主配置檔案中提供全局控制預設閥值為”Full”(ServerTokens Full),所以,如果你的Linux發行版本沒有變更過這個閥值的話,所有與你的系統有關的敏感訊息都會向全世界公開。比如RHEL會將該 閥值變更為”ServerTokens OS”,而Debian依然使用預設的”Full”閥值
以apache-2.0.55為例,閥值可以設定為以下某項(後面為相對應的Banner Header):
Prod >>> Server: Apache
Major >>> Server: Apache/2
Minor >>> Server: Apache/2.0
Minimal >>> Server: Apache/2.0.55
OS >>> Server: Apache/2.0.55 (Debian)
Full (or not specified) default >>> Server: Apache/2.0.55 (Debian) PHP/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b

ServerSignature
控制由系統生成的頁面(錯誤訊息,mod_proxy ftp directory listing等等)的頁腳中如何顯示訊息。

可在全局設定檔案中控制,或是通過.htaccess檔案控制
預設為”off”(ServerSignature Off),有些Linux發行版本可能會開啟這個閥門,比如Debian在預設的虛擬主電腦上預設將這個閥門設定為開放
全局閥門的閥值會被虛擬主電腦或目錄單位的配置檔案中的閥值所覆蓋,所以,必須確保這樣的事情不應該發生
可用的閥值為下面所示:
Off (default): 不輸出任何頁腳訊息 (如同Apache1.2以及更舊版本,用於迷惑)
On:輸出一行關於版本號以及處於運行中的虛擬主電腦的ServerName (2.0.44之後的版本,由ServerTokens負責是否輸出版本號)
EMail: 建立一個傳輸到給ServerAdmin的”mailto”

注意:上述關於如何設定2個閥門從而盡量減少敏感訊息洩露的方法,並不會使你的伺服器真的更安全,如果你現在使用的版本比較舊,請務必盡快將系統升級,降低被蠕蟲攻擊的風險。

【文章標題】:(PHP程式設計) EclipsePHP Studio 1.2.2 ( EPP) 繁體中文版
【文章作者】: PHP-MySQL-程式設計教學密訓基地-總教頭
【作者信箱】: ster168ster@gmail.com
【作者首頁】: http://por.tw/php
【最新教學課程】: http://por.tw/php/new-E_learning/index.php
【基地首頁】: http://por.tw
【版權聲明】: 【原創】PHP-MySQL-程式設計教學密訓基地,轉載必須保留完整標頭。刪除者依法追究!
——————————————————————————–
【文章內容】
  (PHP程式設計) EclipsePHP Studio 1.2.2 ( EPP) 繁體中文版
 
  EclipsePHP Studio 1.2.2 (以下簡稱:EPP 1.2.2)是一個大型PHP項目開發編譯器,給予Eclipse底層開發而來,並且整合了JDK,免除處了安裝配置的麻煩,一次安裝即可使用無需配置。
此編譯器為PHP編譯器,輔助PHP代碼的開發和除錯,整合了代碼高亮,函數追蹤,時時糾錯等功能。
同時還增加了合作開發版本伺服器功能: SVN , CVS 。 內嵌瀏覽器可以在除錯簡單代碼時時瀏覽。
不僅支援php ,也支援其他網路語系像html、xhtml、xml、css和javascript、java、perl、python等!


 
(PHP程式設計)EclipsePHP Studio 1.2.2 特點:
1、方便PHP面向物件開發,有類整合追蹤功能。
2、代碼時時糾錯,讓語法錯誤扼殺在搖籃中。
3、內嵌瀏覽器除錯更加方便快捷。
4、整合了常用的版本伺服器用戶端功能 SVN CVS。
5、豐富的快捷鍵讓開發提高效率。
6、函數,變量,快捷提示,讓開發變的簡單輕鬆。
7、強調的除錯和結構操作,使得更容易開發大型的項目
8、多項目管理,可以用開發者在多個項目之間切換。
9、很好的延伸功能,可以安裝多種外掛程式。
 
(PHP程式設計)EclipsePHP Studio 1.2.2更新:
1、修正編寫PHP代碼時行號不能標準顯示每次開啟丟失問題
2、增加了在EPP中直接開啟檔案目錄方便操作。
3、解決了在Vista 、Windows7 中假死的問題。
4、重新修正了PHP支援內核反應速度更快
5、去除了一些不必要的說明檔案編輯器在增加功能的基礎上較少體積。
 
  備註:本軟體是大陸內地軟體,安裝時是簡體畫面,安裝後可以正常顯示繁體中文。
 
 
  (PHP程式設計)EclipsePHP Studio 1.2.2 ( EPP) 繁體中文版下載網址:
 
  http://por.tw/Downloads/EclipsePHP.Studio-1.2.2.rar
 
——————————————————————————–
你還在自己摸索PHP-MySQL-網頁與網站程式設計嗎?你有【技術顧問服務】可以諮詢嗎?
問題無法解決你要發很多時間處理(或許永遠找出答案)那是自己摸索程式設計的痛苦!
購買【PHP+MySQL程式設計】課程錄影DVD教學課程,你就可獲得技術【顧問諮詢服務】!

PHP程式設計問題諮詢:
請問,資料放入資料庫和取出來顯示在頁面需要注意什麼?

———————————————————
PHP程式設計問題回覆:
資料放入資料庫和取出來顯示在頁面需要注意什麼,可以參考以下的說明:

寫入資料庫時
$str=addslashes($str);
$sql="insert into `tab` (`content`) values('$str')";
輸出資料庫時
$str=stripslashes($str);
顯示資料庫內容時
$str=htmlspecialchars(nl2br($str)) ;

如何讀取當前位址欄資訊?可以參考以下的說明:
<?php
$s="http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME']}";
$se='';
foreach ($_GET as $key => $value) {     
$se.=$key."=".$value."&";     
}   
$se=Preg_Replace("/(.*)&$/","$1",$se);
$se?$se="?".$se:"";
echo   $s."?$se";
?> 

MacBook入手了,配置工作環境,首先得讓Mac OS支援PHP。不管你是採用整合的開發環境,比如XAMPP for Mac OS X,還是採用Mac OS中自帶的Apache和PHP,甚至自己重新編譯安裝,減少麻煩的第一步就是啟用root使用者。

本文采用的模式是使用Mac OS X 10.5.6自帶的Apache和PHP,安裝MySQL的dmg版本,以下操作非特殊說明均以root使用者在指令行下進行。

啟用root使用者
1.開啟「目錄實用工具」,它位於「應用程式」資料夾的「實用工具」資料夾中。
2.點按鎖圖示以進行變更。您將需要輸入管理員名稱和密碼。
3.選取「編輯」>「啟用 Root 使用者」。
4.為 root 使用者輸入安全密碼,然後在「驗證」欄再次輸入它,最後點按「好」。

啟用Apache
Mac OS X 10.5.6自帶了Apache 2.2.9,直接在指令行運行apachectl start,Apache就搞定了。

現在Apache的主目錄就是/Libary/WebServer/Documents/,你可以在這目錄裡放置檔案測試了。

啟用PHP
Mac OS X 10.5.6自帶了PHP 5.2.6,我們需要做的就是將PHP加入Apache中。

修改/etc/apache2/httpd.conf中的
#loadModule php5_module libexec/apache2/libphp5.so

loadModule php5_module libexec/apache2/libphp5.so

然後將/etc/php.ini.default複製為/etc/php.ini。
cp /etc/php.ini.default /etc/php.ini

之後就可以按照自己的習慣修改php.ini的配置
比如將error_reporting = E_ALL & ~E_NOTICE
修改為
error_reporting = E_ALL

最後,重啟Apache,可以在/Libary/WebServer/Documents/目錄中建立個phpinfo.php來測試了。
apachectl restart

PHP程式設計問題諮詢:
我想在每個檔最前,最後面都加上一檔.但一個一個添加很麻煩
有沒有解決的辦法?

———————————————————
PHP程式設計問題回覆:
 我想在每個檔最前,最後面都加上一檔.但一個一個添加很麻煩
您可以這樣處理:

1:打開php.ini文件
設置 include_path= "c:"

2:寫兩個文件
auto_prepend_file.php 和 auto_append_file.php 保存在c磁碟,他們將自動依附在每個php檔的頭部和尾部.

3:在php.ini中找到:
Automatically add files before or after any PHP document.
auto_prepend_file = auto_prepend_file.php;依附在頭部
auto_append_file = auto_append_file.php;依附在尾部

以後你每個php檔就相當於
<?php
Include "auto_prepend_file.php" ;

…….//這裏是你的程式

Include "auto_append_file.php";
?>
———————————————————

PHP程式設計問題諮詢:
我點擊後退按鈕,為什麼之前填寫的東西不見?

———————————————————
PHP程式設計問題回覆:
我點擊後退按鈕,為什麼之前填寫的東西不見,可以參考以下的說明:

這是因為你使用了session.
解決辦法:

——————————————————-
<?php
session_cache_limiter('private, must-revalidate');
session_start();
………..
……….
?>

——————————————————

GUID: 即Globally Unique Identifier(全球唯一標識符)
也稱作 UUID(Universally Unique IDentifier) 。

GUID是一個通過特定算法產生的二進位長度為128位的數字標識符,用於指示產品的唯一性。
GUID 主要用於在擁有多個節點、多台電腦的網路或系統中,配置必須具有唯一性的標識符。

在 Windows 平台上,GUID 廣泛應用於微軟的產品中,用於標識如如註冊表項、類及介面標識、資料庫、系統目錄等對象。   

php中並沒有標準的guid,只是有個函數 uniqid() 生成唯一id。
而在mysql中有函數生成guid:SELECT UUID()

PhpED是一個PHP的IDE(開發整合環境),有著強大的編寫和除錯能力, 而且它也不僅僅是PHP工具,它還可以用來編輯HTML/XHTML/CSS/ XML/SMARTY/等等.

PhpED 通過無與倫比的PHP除錯和壓縮能力,以及一個新的NuSOAP web服務精靈成為了PHP領功能變數的領軍產品。
更加強大的Project Manager使得發佈站台和應用程式比以前更加容易。 現在可以線上程層級對正在運行或是開發中的程式進行測試和調校。
而且,對PostgreSQL和MySQL資料庫的本地支援為PHP使用開源資料庫提供了一個廣泛的環境。

NuSphere PhpEd Professional 7.0 功能簡介:
支援反應敏捷的多語系的語法高亮統一編碼(Unicode)
支援代碼範本完全自訂快捷鍵搜尋和置換拖放支援代碼自動完成工具提示和自動分析php和html代碼的錯誤
代碼流覽器提示函數參數和返回值快速函數參考提示商用的PHP除錯器自帶的可選IE工具列提供除錯等功能
遠端除錯提供完整web伺服器和PHP CGI模組的代碼本地除錯支援除錯執行緒精確計算程式運行時間
讓你進一步精簡優秀代碼快速調動檔原始碼調動,支援ftp,sftp支援發佈篩檢程式增強的 SVN/CVS支援自帶Telnet/SSH支援。

NuSphere PhpEd is today's top integrated development environment for php. Suitable both for small individual works and large multi-developer projects, PhpED considerably boost up the development process. PhpED is a robust tool featuring full-cycle functionality for developing web-sites and web-applications. Balanced combination of advanced code editor, reliable dbg debugger, productive database connectivity client and fast and secure deployment abilities make PhpED a complete solution for most sophisticated developer needs. As in any complicated process, in php development a great deal of effectiveness depends on your choice of production tools. According to our customers, PhpED can save up to 75% of their development time.

PhpED is the leading PHP IDE with Advanced PHP Editor, PHP Debugger and PHP Profiler, Code Insight, Database Client, Integrated Help System, full support for JavaScript, HTML, CSS, XML, SMARTY, XHTML and other. The features available in PhpED bring you unmatched number of great PHP Tools

Advanced Editor

Full support for PHP versions from 4.2 to 5.3 in IDE and the Editor – from functions and local variables to namespaces and aliases
Dynamic Syntax Highlighting Flash Demo
The editor will automatically switch the syntax highlighting dependant on the position in the file. The strength of PHP is in ability to embed it in the other documents, like HTML. However, sometimes the document becomes too crowded with the lines of code from multiple languages. Auto-switch feature will let you focus on the code and the language that you are currently working on. It will only highlight those parts of the document, which are written in the same language as the current position of the cursor and deem the rest of the text. The editor will switch between php, html, smarty, css and javascript, depending on the type of the file.
Multiple Language Syntax Highlighting Flash Demo
Code sensitive syntax color highlighter gives you the ability to have separate highlighting for different languages in the same file. Highlighting for each language is of course fully configurable in PhpED's settings.
Auto Highlight variable
System highlights all occurrences of a variable in the Editor, when PHP variable is selected. Also highlighted are open/close HTML tags
Code Folding Flash Demo
Selectively hide and display sections of a currently-edited file. PHP IDE displays the collapsible regions of the code with folding marks. Works for PHP, HTML, JavaScript, CSS and other.
Support for all HTML standards – 3.2, 4.0, xhtml, 5.0
Fast search
Modal non-blocking search in background, starts from the top after full cycle. Fast Search shortcut
Diff viewer
Shows side by side difference between the file in the editor and local and remote copies

Debugging and Profiling Flash Demo

Commercial versions of PHP DBG Debugger – the most powerful debugger currently available provides unmatched debugging productivity and safety in both local and remote debugging modes. Learn more
PhpED advanced php profiler shows executing time for each line, function or module of the code with tenth millisecond's precision. You can locate all the bottlenecks quickly and efficiently. Profiler saves all the timings among multiple sessions so your can compare them and evaluate the improvements. Learn more
Triggering debugger on errors or exceptions. Learn more
Remote and local debuggin setup with easy to follow wizard

Code Insight Flash Demo

Code Completion. Dynamically provides the available properties and methods for a given variable or class, and automatically concludes partially typed keywords. Code completion works for JavaScript, HTML and CSS too. It shows properties for tags, classes and attributes. Flash Demo
Tool tips and Instant error analysis for Php, JavaScript, HTML and CSS make coding an easy task – no more simple mistakes and typos.
Full control over different versions – select which parser to use for any PHP version or HTML and CSS – including PHP 5.3, HTML5 and CSS3
Project-wide code explorer in PhpED IDE shows all php, javascript classes, methods, properties, functions and variables in every detail and facilitates object-oriented programming. Also supported: HTML and CSS.
Hints show you arguments and returning value for a just typed function, as well as a short description for them.
Fast functions reference shows you all the PHP functions as they are available from PHP extensions. Nested calls are supported with unlimited nesting level.
Code intelisense HTML Tags – IDE automatically adds closing bracket when you type in HTML tag
Auto Add HTML attributes – IDE automatically displays required attributes when the tag is entered
Code intelisense CSS – with support for CSS3 features
PHP, HTML, and CSS code Validator
PhpED's built-in code Validator checks out the syntax in PHP, HTML and CSS code and displays the error – both in the PHP editor and error bar. PHP IDE finds all errors that will cause problems during execution – e.g. missing semicolons, open brackets, missing quotes etc. HTML sections of the code are checked for unmatched tags and/or attributes, which are not supported in the corresponding version of HTML standard, missing re quired attributes, open quotes etc. Learn the details of the Code Validator here.
Find usage – Simple click to find all places where selected function, method or class are used in the Project.

Testing

Full integration with phpUnit
Easy to use UI to setup all options available in phpUnit configure.xml
In-Editor display of the tree of tests, with the ability to execute all or selected tests, navigation to source files and filtering of the display tests
Display, storage and export of the results to csv or excel.

Embedded browsers

See the pages generated by your code in IE 8 and Firefox 4.0 with out leaving the IDE. You can also use any external browser of course

Even more Advanced Editor

Smarty Highlighter
PhpED comes with Syntax Highlighter for Smarty's .tpl files. This feature, combined with Dynamic Syntax Highlighting and Multiple Language Syntax Highlighting provides for unmatched convenience and productivity of PHP developers usin
g Smarty templates in their work.
True Unicode editing. Create web pages in several natural languages simultaneously.
Code templates allow you to type whole code fragments at once by a single key press. You can add new templates and change existing ones.
Fully customizable shortcuts, advanced editor features such as brace matching, context-sensitive auto-indent and smart-home speed up your work significantly.
Search and replace scope. Now find and replace works in multiple files and directories as well as in all opened files! Regular expressions allow you to find text using complex conditions.
Drag-n-drop operations support. Try to drag an image from the file browser or project manager in to your HTML page directly. Database explorer supports drag operations too.

Project and File Management

Quick deployment. Once publishing is set up according to your needs, you can upload your PHP projects with a single click!
Project-wide code explorer in PhpED IDE shows all php classes, methods, properties, functions and variables in every detail and facilitates object-oriented programming.
Secure deployment. Support for SFTP, FTPS (TLS/SSL) and WebDAV/HTTPS (SSL) protocols make deployment and data transfer secure now
Fast deployment of remote project on local networks. Support of Windows Share (Samba)
Enhanced integration. Integrate PhpED IDE with 3rd party tools like Tortoise SVN or Tortoise CVS.
Terminal connections (Telnet and SSH) are supported. Perform your remote administration tasks from within PhpED
Embedded tools for more effective coding, editing and code management. PhpED IDE includes a number of pre-configured tools like PHP documentor, HTML Tidy, Code Formatter, Html Validator and CVS client.

Database client

SQLite, MySQL, MSSQL, Oracle, PostgreSQL and InterBase support. Quick access to multiple types of databases through a GUI tool boosts up your productivity. Browse the tables, drag and drop fields, tables names, views, stored procedures, triggers etc. and run any sql statement to manipulate the data and the metadata stored in the database – all without leaving the IDE.
NuSoap wizard and NuSoap connection client let you easily enhance your code with WDSL services. Drag-n-drop is fully supported Flash Demo

Refactoring of PHP code

Extract any selected block of code into a method or function
Rename and identifier – variable, function, class or method and the system will update all usages of that identifier in the project
Side by side differences display of before and after refactoring operation

Integrated help system

Embedded manuals. PhpED is delivered with several most needed manuals, including manuals and references for php, css2, html4.01, html3.2, mysql, postgresql, smarty and others. You can customize the list of manuals adding other resources you may need for your work.
Context help for Php, HTML and CSS. Pressing F1 invokes context sensitive help for the code under cursor (php functions, html tags and attribute and css classes).

Supported platforms for NuSphere PhpED:

Windows 2000 (sp5 or higher), 2003, 2008, XP, Vista, Windows7

《PHP綜合開發環境》NuSphere PhpEd Professional 7.0 Build 7019官方網站:

http://www.nusphere.com/

PHP程式設計問題諮詢:
我想要如何配置GD庫,其方法為何?

———————————————————
PHP程式設計問題回覆:
您要如何配置GD庫,可以參考以下的範例:

1:用dos命令(也可以手動操作,拷貝dlls檔夾裏所有dll檔到system32目錄下) copy c:phpdlls*.dll c:windowssystem32
2:打開php.ini
設置extension_dir = "c:/php/extensions/";
3:
extension=php_gd2.dll;把extension前面的逗號去掉,如果沒有php_gd2.dll,php_gd.dll也一樣,保證確實存在這一檔c:/php/extensions/php_gd2.dll
4:運行下面程式進行測試
<?php
Ob_end_flush();
//注意,在此之前不能向流覽器輸出任何資訊,要注意是否設置了 auto_prepend_file.
header ("Content-type: image/png");
$im = @imagecreate (200, 100)
    or die ("無法創建圖像");
$background_color = imagecolorallocate ($im, 0,0, 0);
$text_color = imagecolorallocate ($im, 230, 140, 150);
imagestring ($im, 3, 30, 50,  "A Simple Text String", $text_color);
imagepng ($im);
?>

———————————————————————-

由MySQL用來存儲資料的檔案格式以已經被廣泛地測試過,但是總是有外部情況可以導致資料庫表被破壞:

mysqld進程在一個寫入當中被殺死;電腦的意外關閉(例如,如果電腦掉電);一個硬體錯誤。

這章描述如何檢查和處理在MySQL資料庫中的資料損壞。如果你的表損壞很多,你應該嘗試找出其原因!見G.1 調試一個MySQL伺服器。

在執行崩潰恢復時,理解在一個資料庫中的每一個表tbl_name對應的在資料庫目錄中的3個檔是很重要的:

檔 用途

“tbl_name.frm” 表定義(表格)檔
“tbl_name.MYD” 資料檔案
“tbl_name.MYI” 索引檔

這3個檔的每一個檔案類型可能遭受不同形式的損壞,但是問題最常發生在資料檔案和索引檔。

myisamchk通過一行一行地創建一個“.MYD”(資料 )檔的副本來工作,它通過由刪除老的“.MYD 檔並且重命名新檔到原來的檔案名結束修復階段。如果你使用–quick,myisamchk不創建一個臨時“.MYD”檔,只是假定“.MYD”檔是正確的並且僅創建一個新的索引檔,不接觸“.MYD”檔,這是安全的,因為myisamchk自動檢測“.MYD”檔是否損壞並且在這種情況下,放棄修復。你也可以給myisamchk兩個–quick選項。在這種情況下,myisamchk不會在一些錯誤上(象重複按鍵)放棄,相反試圖通過修改“.MYD”檔解決它們。通常,只有在你在太少的空閒磁碟空間上實施一個正常修復,使用兩個–quick選項才有用。在這種情況下,你應該至少在運行myisamchk前做一個備份。

一、怎樣檢查表的錯誤

為了檢查一張表,使用下列命令:

myisamchk tbl_name

這能找出所有錯誤的99.99%。它不能找出的是僅僅涉及資料檔案的損壞(這很不常見)。如果你想要檢查一張表,你通常應該沒有選項地運行myisamchk或用-s或–silent選項的任何一個。

myisamchk -e tbl_name

它做一個完全徹底的資料檢查(-e意思是“擴展檢查”)。它對每一行做每個鍵的讀檢查以證實他們確實指向正確的行。這在一個有很多鍵的大表上可能花很長時間。myisamchk通常將在它發現第一個錯誤以後停止。如果你想要獲得更多的資訊,你能增加–verbose(-v)選項。這使得myisamchk繼續一直到最多20個錯誤。在一般使用中,一個簡單的myisamchk(沒有除表名以外的參數)就足夠了。

myisamchk -e -i tbl_name

象前面的命令一樣,但是-i選項告訴myisamchk還列印出一些統計資訊。

二、怎樣修復表

一張損壞的表的症狀通常是查詢意外中斷並且你能看到例如這些錯誤:

“tbl_name.frm”被鎖定不能改變。

不能找到檔“tbl_name.MYI”(Errcode :### )。

從表處理器的得到錯誤###(此時,錯誤135是一個例外)。

意外的檔結束。

記錄檔被毀壞。

在這些情況下,你必須修復表。myisamchk通常能檢測並且修復出錯的大部分東西。

修復過程包含最多4個階段,在下麵描述。在你開始前,你應該cd到資料庫目錄和檢查表檔的許可權,確保他們可被運行mysqld的Unix使用者讀取(和你,因為你需要存取你正在檢查的檔)。如果它拒絕你修改檔,他們也必須是可被你寫入的。

階段1:檢查你的表

運行

myisamchk *.MYI

或(myisamchk -e *.MYI,如果你有更多的時間)。使用-s(沉默)選項禁止不必要的資訊。

你必須只修復那些myisamchk報告有一個錯誤的表。對這樣的表,繼續到階段2。

如果在檢查時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。

階段2 :簡單安全的修復

首先,試試myisamchk -r -q tbl_name(-r -q意味著“快速復原模式”)。這將試圖不接觸資料檔案來修復索引檔。如果資料檔案包含它應有的一切和在資料檔案指向正確地點的刪除連接,這應該管用並且表可被修復。開始修理下一張表。否則,使用下列過程:

在繼續前做資料檔案的一個備份。

使用myisamchk -r tbl_name(-r意味著“復原模式”)。這將從資料檔案中刪除不正確的記錄和已被刪除的記錄並重建索引檔。

如果前面的步驟失敗,使用myisamchk –safe-recover tbl_name。安全復原模式使用一個老的恢復方法,處理常規復原模式不行的少數情況(但是更慢)。

如果在修復時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。

階段3 :困難的修理

如果在索引檔的第一個16K塊被破壞,或包含不正確的資訊,或如果索引檔丟失,你只應該到這個階段 。在這種情況下,創建一個新的索引檔是必要的。按如下這樣做:

把資料檔案移更安全的地方。

使用表描述檔創建新的(空)資料和索引檔:

shell> mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit

將老的資料檔案拷貝到新創建的資料檔案之中。(不要只是將老檔移回新檔之中;你要保留一個副本以防某些東西出錯。)

回到階段2。現在myisamchk -r -q應該工作了。(這不應該是一個無限迴圈)。

階段4:非常困難的修復

只有描述檔也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被創建以後,描述檔就不再改變了。

從一個備份恢復描述檔並且回到階段3。你也可以恢復索引檔並且回到階段2。對後者,你應該用myisamchk -r啟動。

如果你沒有一個備份但是確切地知道表是怎樣被創建的,在另一個資料庫中創建表的一個拷貝。刪除新的資料檔案,然後從其他資料庫將描述和索引檔移到破壞的資料庫中。這給了你新的描述和索引檔,但是讓資料檔案獨自留下來了。回到階段2並且嘗試重建索引檔。

三、表優化

為了組合成碎片的記錄並且消除由於刪除或更新記錄而浪費的空間, 以復原模式運行myisamchk:

shell> myisamchk -r tbl_name

你可以用SQL的OPTIMIZE TABLE語句使用的相同方式來優化一張表,OPTIMIZE TABLE比較容易,但是myisamchk更快。也沒有在一個實用程式和伺服器之間不必要的交互可能性,因為當你使用OPTIMIZE TABLE時,伺服器做所有的工作。

myisamchk也有你可用來改進一個表的性能的很多其他選項:

-S, –sort-index
-R index_num, –sort-records=index_num
-a, –analyze

對於選項完整的描述見myisamchk調用語法。

FROM:http://www.weste.net/2006/10-26/09563664541.html