<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>Jollen&apos;s PHP 專欄</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/" />
   <link rel="self" type="application/atom+xml" href="http://www.jollen.org/php/atom.xml" />
   <id>tag:www.jollen.org,2007:/php/8</id>
   <updated>2006-12-23T02:18:11Z</updated>
   
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.32</generator>

<entry>
   <title>Jollen&apos;s PHP 專欄說明</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_jollens_blog_web_real.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.152</id>
   
   <published>2006-11-22T11:00:00Z</published>
   <updated>2006-12-23T02:18:11Z</updated>
   
   <summary>本專欄「Jollen&apos;s PHP」希望與大家共同學習 Web-based software 的基礎技術，由於 Jollen 早期有許多相關的文章，因此希望能透過共筆的方式，一同編輯一本免費的線上電子書讓大家享受學習的樂趣。 本專欄目前是「Beta」狀態，希望來學習的朋友能協助除蟲囉！本專欄的運作模式將規劃為「共筆」制，因此雖然這個網站的內容是「自由（Free）」的，但不表示網站上的東西都能自由轉貼引用喔！Jollen&apos;s PHP 專欄的內容將會採取較嚴謹的版權保護。 您必須遵守 Attribution-NonCommercial-NoDerivs 2.5 授權條款；但是假如您都是線上閱讀我們的文章，那麼是不會有任何版權上的問題的。 目前陸續上線的內容為： Volume 2, PHP Volume 3, MySQL (預計 2007/1/31) 公告更新紀錄 2006/11/22, version 0.3 - PHP 的部份開放了！ 2006/11/01, version 0.2 2006/10/27, version 0.1 加入共筆 共筆作者可享有較寬鬆的授權許可，所以我們對內容採合理的版權保護，也能保障您的著作權。不管您是 Web-enabled 技術的專家或者是希望現學現賣的朋友，都能加入我們的行列。希望跟我們一起學習研究嗎？您的名字將會在此專欄出現！...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[本專欄「Jollen's PHP」希望與大家共同學習 Web-based software 的基礎技術，由於 Jollen 早期有許多相關的文章，因此希望能透過共筆的方式，一同編輯一本免費的線上電子書讓大家享受學習的樂趣。

本專欄目前是「Beta」狀態，希望來學習的朋友能協助除蟲囉！本專欄的運作模式將規劃為「共筆」制，因此雖然這個網站的內容是「自由（Free）」的，但不表示網站上的東西都能自由轉貼引用喔！Jollen's PHP 專欄的內容將會採取較嚴謹的版權保護。

<strong>您必須遵守 Attribution-NonCommercial-NoDerivs 2.5 授權條款；但是假如您都是線上閱讀我們的文章，那麼是不會有任何版權上的問題的。</strong>

目前陸續上線的內容為：

Volume 2, PHP
Volume 3, MySQL (預計 2007/1/31)
<strong>公告更新紀錄</strong>

2006/11/22, version 0.3
- PHP 的部份開放了！
2006/11/01, version 0.2
2006/10/27, version 0.1

<strong>加入共筆</strong>

共筆作者可享有較寬鬆的授權許可，所以我們對內容採合理的版權保護，也能保障您的著作權。不管您是 Web-enabled 技術的專家或者是希望現學現賣的朋友，都能加入我們的行列。希望跟我們一起學習研究嗎？您的名字將會在此專欄出現！

如果您對 PHP, MySQL, Javascript, AJAX, HTTP 等技術有心得想要發表的話，請利用 Email: jollen@o3.net 與我連絡。Jollen 會為您開闢一個「jollen.org」的部落格（blog）帳號，讓您盡情發揮，並收錄至 jollen.org 網站上。「Jollen's PHP 專欄作家」的工作是：

1. 能在此 Blog 上發表心得、整理資料與自學新技術，並經共同編輯後正式收錄至網站上。
2. 協助 Jollen's PHP 專欄除錯（debug），或是建議更新的內容。
3. 網站維護：擔任板主等等。

<strong>關於評論</strong>

評論功能是開放的，您可透過評論來提供您的看法、修正與意見，但由於我們的 Blog 系統與 WWW 主機是分開的，因此您的評論並不會即時顯示在網站上。一般來說，您的評論將會在 12 個小時內更新（同步）至 WWW 主機。]]>
      
   </content>
</entry>
<entry>
   <title>94. 關於 session 的生存期限</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_94_session.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.180</id>
   
   <published>2006-10-27T14:14:24Z</published>
   <updated>2006-10-27T14:14:46Z</updated>
   
   <summary>大家可能會有一個疑問，那就是，只要使用者登入一次後，如果 server 端永遠保存 session 的內容，那使用者不就永遠不用登入了嗎？答案是：對的。 但是事實上卻不是如此，因為 session 並不是永遠都存在著，只要 session 一消失，程式讀不到 session 的內容，自然會再要求使用者登入。 也就是說，session 有一個「生存期限」，當生存期限過了之後，session 自然會消失。那麼，session 在什麼情況下會消失呢？當底下幾種情況發生時，session 就會消失： 1. 關閉瀏覽器並重新開啟後，session 就會消失 2. session 生存期限到時後，session 自動消失 PHP 預設是將瀏覽器關閉並重新開啟後，session 就自行消失，也就是 session 的 lifetime 為0。 其實我們可以自己設定 session 的生存期限，當生存期限到期時，session 就會自動消失，而不管瀏覽器是不是被關閉並重新開啟。 什麼場合需要重設 session 的生存期限呢？例如，我們希望使用者在 10 分鐘後重新登入，我們就可以設定...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[大家可能會有一個疑問，那就是，只要使用者登入一次後，如果 server 端永遠保存 session 的內容，那使用者不就永遠不用登入了嗎？答案是：對的。

但是事實上卻不是如此，因為 session 並不是永遠都存在著，只要 session 一消失，程式讀不到 session 的內容，自然會再要求使用者登入。

也就是說，session 有一個「生存期限」，當生存期限過了之後，session 自然會消失。那麼，session 在什麼情況下會消失呢？當底下幾種情況發生時，session 就會消失：

1. 關閉瀏覽器並重新開啟後，session 就會消失
2. session 生存期限到時後，session 自動消失

PHP 預設是將瀏覽器關閉並重新開啟後，session 就自行消失，也就是 session 的 lifetime 為0。

其實我們可以自己設定 session 的生存期限，當生存期限到期時，session 就會自動消失，而不管瀏覽器是不是被關閉並重新開啟。

什麼場合需要重設 session 的生存期限呢？例如，我們希望使用者在 10 分鐘後重新登入，我們就可以設定 session 的生存期限為 10 分鐘。

要設定 session 的生存期限，只要修改 php.ini 設定即可：

<pre><blockquote><em>session.cookie_lifetime   = 0</em></blockquote></pre>

修改這個設定項目即可。session lifetime 的預設值為 0，也就是將瀏覽器關閉並重新開啟後 session 才消失。只要將這個值改成我們要的時間即可，單位是秒：

<pre><blockquote><em>session.cookie_lifetime   = 600</em></blockquote></pre>

設定 session 在 600 秒後自動消失。]]>
      
   </content>
</entry>
<entry>
   <title>93. PHP 要如何使用 session？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_93_php_session.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.179</id>
   
   <published>2006-10-27T14:13:43Z</published>
   <updated>2006-10-27T14:14:17Z</updated>
   
   <summary>session 的使用必須經過啟動、註冊的程序，底下以步驟方式說明 session 的使用方法： 1. 初始化 session： session_start(); 2. 註冊 session： session_register(&quot;userID&quot;); 所謂的註冊 session 意思就是將變數的值保存到 session 裡。要特別注意這裡的寫法，要註冊的變數寫法是： session_register(&quot;userID&quot;); (變數的名稱) 這是錯誤的寫法： session_register($userID); 3. 清除 session： session_destroy(); 當我們不再使用 session 時，可以呼叫session_destroy() 將所有已註冊的 session 清除。...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[session 的使用必須經過啟動、註冊的程序，底下以步驟方式說明 session 的使用方法：

1. 初始化 session：

<pre><blockquote><em>session_start();</em></blockquote></pre>

2. 註冊 session：

<pre><blockquote><em>session_register("userID");</em></blockquote></pre>

所謂的註冊 session 意思就是將變數的值保存到 session 裡。要特別注意這裡的寫法，要註冊的變數寫法是：

<pre><blockquote><em>session_register("userID"); (變數的名稱)</em></blockquote></pre>

這是錯誤的寫法：

<pre><blockquote><em>session_register($userID);</em></blockquote></pre>

3. 清除 session：

<pre><blockquote><em>session_destroy();</em></blockquote></pre>

當我們不再使用 session 時，可以呼叫session_destroy() 將所有已註冊的 session 清除。]]>
      
   </content>
</entry>
<entry>
   <title>92. 什麼是 Session？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_92_session.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.178</id>
   
   <published>2006-10-27T14:13:11Z</published>
   <updated>2006-10-27T14:13:30Z</updated>
   
   <summary>到目前為止我們我們可以發現cookie的一個特點：同一個目錄下與其子目錄下的檔案都可以讀取到cookie。因為cookie具備這樣的特色，因此我們才可以利用cookie儲存使用者的相關資訊。 session 與 cookie 不同的地方在於，cookie 的資訊是儲存在使用者端 (client)，但是session則是儲存在伺服器端 (server)。 事實上 session 如果沒有 cookie 也沒有辦法運作，但是我們知道，使用者端是否接受 cookie 可以在瀏覽器裡設定，因為使用者也可以拒絕接受 cookie。幸運的是，PHP 內建的 session 函數在沒有 cookie 場合下可以採取其它方法，因此還可以使用 session。 為什麼要使用 session 而不用 cookie 呢？ 1. 因為使用 session 將資用者資訊儲存在 server 端是比較安全的做法 2. 使用者關閉 cookie 的功能時，session 仍然可以運作...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      到目前為止我們我們可以發現cookie的一個特點：同一個目錄下與其子目錄下的檔案都可以讀取到cookie。因為cookie具備這樣的特色，因此我們才可以利用cookie儲存使用者的相關資訊。

session 與 cookie 不同的地方在於，cookie 的資訊是儲存在使用者端 (client)，但是session則是儲存在伺服器端 (server)。

事實上 session 如果沒有 cookie 也沒有辦法運作，但是我們知道，使用者端是否接受 cookie 可以在瀏覽器裡設定，因為使用者也可以拒絕接受 cookie。幸運的是，PHP 內建的 session 函數在沒有 cookie 場合下可以採取其它方法，因此還可以使用 session。

為什麼要使用 session 而不用 cookie 呢？

1. 因為使用 session 將資用者資訊儲存在 server 端是比較安全的做法
2. 使用者關閉 cookie 的功能時，session 仍然可以運作
      
   </content>
</entry>
<entry>
   <title>91. PHP 如何讀取 Cookies 的資料？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_91_php_cookies.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.177</id>
   
   <published>2006-10-27T14:12:47Z</published>
   <updated>2006-10-27T14:18:28Z</updated>
   
   <summary><![CDATA[所有的 cookies 會被存放於 $HTTP_COOKIE_VARS[] 陣列裡，我們也可以透過這個環境變數來取得 cookies，例如： $fullname = $HTTP_COOKIE_VARS["fullname"]; 同樣類型的 cookie 也可以建立成陣列的型式，以方便管理。 &lt;?php $visits = $HTTP_COOKIE_VARS['visits']; if (!isset($visits)) $visits = 1; setcookie("visits", $visits+1); ?&gt; &lt;p&gt;歡迎您第 &lt;?=$visits?&gt; 次光臨!&lt;/p&gt; 我們再來看一個範例： &lt;?php if ($QUERY_STRING != 'SET') { setcookie("cookie", "COOKIES OK!"); header("Location: $PHP_SELF?SET"); }...]]></summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[所有的 cookies 會被存放於 $HTTP_COOKIE_VARS[] 陣列裡，我們也可以透過這個環境變數來取得 cookies，例如：

<pre><blockquote><em>$fullname = $HTTP_COOKIE_VARS["fullname"];</em></blockquote></pre>

同樣類型的 cookie 也可以建立成陣列的型式，以方便管理。

<pre><blockquote><em>&lt;?php
$visits = $HTTP_COOKIE_VARS['visits'];
if (!isset($visits)) $visits = 1;
setcookie("visits", $visits+1);
?&gt;
&lt;p&gt;歡迎您第 &lt;?=$visits?&gt; 次光臨!&lt;/p&gt;</em></blockquote></pre>

我們再來看一個範例：

<pre><blockquote><em>&lt;?php
<br />if ($QUERY_STRING != 'SET') {
   setcookie("cookie", "COOKIES OK!");
   header("Location: $PHP_SELF?SET");
}
<br />if ($cookie != 'COOKIES OK!') {
<br />   header("Content-type: text/html");
<br />   echo "&lt;html&gt;
         &lt;head&gt;
         &lt;/head&gt;
         &lt;body&gt;
         &lt;p&gt;您的瀏覽器並不支援 Cookies !&lt;/p&gt;
         &lt;/body&gt;
         &lt;/html&gt;";
} else {
<br />   header("Content-type: text/html");
<br />   echo "&lt;html&gt;
         &lt;head&gt;
         &lt;/head&gt;
         &lt;body&gt;
         &lt;p&gt;您的瀏覽器可使用 Cookies !&lt;/p&gt;
         &lt;/body&gt;
         &lt;/html&gt;";
}
<br />?&gt;</em></blockquote></pre>

這個簡單的範例可以用來檢查使用者的瀏覽器是否支援 cookies。]]>
      
   </content>
</entry>
<entry>
   <title>90. 使用 Cookies 有哪些限制？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_90_cookies.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.176</id>
   
   <published>2006-10-27T14:12:21Z</published>
   <updated>2006-10-27T14:12:38Z</updated>
   
   <summary>使用者端最多可以同時擁有 300 個 cookies，同一個伺服器最多只能建立 20 個 cookies 給同一個使用者。 每個 cookies 最大只能到 4K。在使用者瀏覽含有 cookies 的網頁時，瀏覽器會將 cookies 暫存於記憶體中，當瀏覽器結束執行後，所有尚未到期的 cookies 都會被儲存於 cookies.txt 的純文字檔裡，cookies.txt 最大只能到 1.2MB。 儲存到 cookies.txt 裡的 cookies 會等待在下次連線時使用。當使用者下次再瀏覽該網頁時，瀏覽器便會根據 path 與 domain 將 cookies 回傳給伺服器。 有些網頁的討論區雖然是採用會員制，但第一次登入後就不必再輸入，甚致關機後再上線也是如此，這麼親切的功能就是使用 cookies 完成的。方法很簡單，使用者登入後便在使用者端建立一個 cookies，下次上線時如果這個 cookies 還在，就不再要求使用者登入。 使用...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[使用者端最多可以同時擁有 300 個 cookies，同一個伺服器最多只能建立 20 個 cookies 給同一個使用者。

每個 cookies 最大只能到 4K。在使用者瀏覽含有 cookies 的網頁時，瀏覽器會將 cookies 暫存於記憶體中，當瀏覽器結束執行後，所有尚未到期的 cookies 都會被儲存於 cookies.txt 的純文字檔裡，cookies.txt 最大只能到 1.2MB。

儲存到 cookies.txt 裡的 cookies 會等待在下次連線時使用。當使用者下次再瀏覽該網頁時，瀏覽器便會根據 path 與 domain 將 cookies 回傳給伺服器。

有些網頁的討論區雖然是採用會員制，但第一次登入後就不必再輸入，甚致關機後再上線也是如此，這麼親切的功能就是使用 cookies 完成的。方法很簡單，使用者登入後便在使用者端建立一個 cookies，下次上線時如果這個 cookies 還在，就不再要求使用者登入。

使用 setcookie() 要注意一點，當 PHP 裡有多個 setcookie() 時，執行時是由後往前執行，因此，假如我們要刪除一個 cookies，再建立同樣的 cookie，則必須寫成：

<pre><blockquote><em>setcookie("fullname", "Jacky");
setcookie("fullname");</em></blockquote></pre>]]>
      
   </content>
</entry>
<entry>
   <title>89. Cookies 可以做什麼應用？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_89_cookies.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.175</id>
   
   <published>2006-10-27T14:11:47Z</published>
   <updated>2006-10-27T14:17:39Z</updated>
   
   <summary><![CDATA[一般在撰寫 CGI 程式時，必須使用 Set-Cookie 檔頭來建立 cookes，不過 PHP 提供了 setcookie() 函數可以幫我們輕鬆完成這項工作。 setcookie 函數的原型： int setcookie(string name, string value, int expire, string path, string domain, int secure); 由於 setcookie() 函數只是減輕我們撰寫檔頭的工作，所以 setcookie() 函數使用時和 header() 函數一樣，必須在沒有任何輸出之間呼叫，否則會發生錯誤。 如果 PHP 程式是寫 HTML 裡，則 setcookie() 函數必須寫在 &lt;HTML&gt;...]]></summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[一般在撰寫 CGI 程式時，必須使用 Set-Cookie 檔頭來建立 cookes，不過 PHP 提供了 setcookie() 函數可以幫我們輕鬆完成這項工作。

setcookie 函數的原型：

<pre><blockquote><em>int setcookie(string name, string value, int expire, string path, string domain, int secure);</em></blockquote></pre>

由於 setcookie() 函數只是減輕我們撰寫檔頭的工作，所以 setcookie() 函數使用時和 header() 函數一樣，必須在沒有任何輸出之間呼叫，否則會發生錯誤。

如果 PHP 程式是寫 HTML 裡，則 setcookie() 函數必須寫在 &lt;HTML&gt; 標籤之前。請看底下的範例：

<pre><blockquote><em>&lt;?php
setcookie("username", "Jollen", time()+3600);
?&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;</em></blockquote></pre>

由於 cookies 也是屬於 HTTP 的檔頭資訊，因此在 setcookie() 前不能有任何的 字串或 PHP 警告訊息輸出。

這個範例表示我們要設定一個名為 username 的 cookie，該 cookie 的到期時間為 time()+3600，也就是 1 小時後。

setcookie 所接受的參數依序解釋如下：

□ name
cookies 的名稱。

□ value
cookies 的值，可以是字串或數字。

□ expire
cookies 的到期時間，例如：

<pre><blockquote><em>setcookie("username", "Jollen", time()+3600);</em></blockquote></pre>

表示 username 這個 cookies 的到期時間為 time()+3600，也就是 1 小時後。

□ path
設定 cookies 在伺服器端所屬的路徑。path 指定只有該目錄下的檔案與其子目錄可以讀取該 cookies。

□ domain
設定 cookies 所屬的網域名稱。指定網域名稱時，不用加上主機名稱，例如：

<pre><blockquote><em>setcookie("TestCookie",$value,time()+3600,"/~jollen/",".jollen.org",1);</em></blockquote></pre>

要特別注意，雖然沒有加上主機名稱，可是開頭的小數點不能省略。

□ secure
指定 1 表示該 cookie 只有在 HTTPS 協定下才能傳送。

如果只指定 cookies 的名稱給 setcookie()，表示要刪除該 cookies。例如：

<pre><blockquote><em>if (isset($UserName))
setcookie("UserName");</em></blockquote></pre>

傳入參數時，如果要略過某些參數，可以傳入空字串，但 expire 與 secure 則必須傳入 0。例如：

<pre><blockquote><em>setcookie("user", "Hellen", 0, "", "", 1);</em></blockquote></pre>

如果我們省略 path 或 domain 參數，setcookie() 會自動我們指定網頁所在的目錄與主機的網域名稱。secure 預設是不使用 HTTPS 傳送。瀏覽器則是根據 path 與 domain 來判斷要送出 cookies 給誰。]]>
      
   </content>
</entry>
<entry>
   <title>88. 什麼是 Cookies？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_88_cookies.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.174</id>
   
   <published>2006-10-27T14:11:21Z</published>
   <updated>2006-10-27T14:11:38Z</updated>
   
   <summary>cookies 是一種伺服器端程式用來將資料儲存在使用者端的技術，使用者是否能使用 cookies 端看瀏覽器是否支援。目前瀏覽器雙雄與較新的瀏覽器均支援 cookes，因此可以藉由 cookies 的機制做出許多有趣的技巧。...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.16 Session 與 Cookies 程式設計" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      cookies 是一種伺服器端程式用來將資料儲存在使用者端的技術，使用者是否能使用 cookies 端看瀏覽器是否支援。目前瀏覽器雙雄與較新的瀏覽器均支援 cookes，因此可以藉由 cookies 的機制做出許多有趣的技巧。
      
   </content>
</entry>
<entry>
   <title>87. 如何撰寫 PHP 的 Regular Expression？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_87_php_regular_expression.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.173</id>
   
   <published>2006-10-27T14:10:33Z</published>
   <updated>2006-10-27T14:10:59Z</updated>
   
   <summary>底下是 PHP 的 regular expression 語法整理，與 MySQL 的 regular expression 並不完全相同，要特別注意一下兩者的小差異。 pattern 用途 e* 符合零個以上的 e+ 符合零個以上的 e? 符合一個或零個的 {n} 用途和 MySQL 的語法一樣 {n,} 用途和 MySQL 的語法一樣 {n, m} 用途和 MySQL 的語法一樣 ^ 用途和 MySQL 的語法一樣 $ 用途和 MySQL 的語法一樣...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.15 PHP 的 Regular Expression" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[底下是 PHP 的 regular expression 語法整理，與 MySQL 的 regular expression 並不完全相同，要特別注意一下兩者的小差異。

<pre><blockquote><em>pattern	用途
e*	符合零個以上的
e+	符合零個以上的
e?	符合一個或零個的
{n}	用途和 MySQL 的語法一樣
{n,}	用途和 MySQL 的語法一樣
{n, m}	用途和 MySQL 的語法一樣
^	用途和 MySQL 的語法一樣
$	用途和 MySQL 的語法一樣
.	任何字元，但不包含 '\n'
|	用途和 MySQL 的語法一樣
[...]	用途和 MySQL 的語法一樣。PHP 也有類別用法，因此 "..." 也可以是類別常數，在後面會提到。</em></blockquote></pre>

舉幾個例子：

<pre><blockquote><em>ab*c		→ ac 	abbc		abbbbbc		皆符合條件
ab+c		→ abbc	abbbc	abbbbbbbc	皆符合條件
ab?c		→ abc	ac					皆符合條件</em></blockquote></pre>

另外，PHP 也有類別的用法，如下表：

<pre><blockquote><em>類別	符合類別的字元
alpha	0-9 與 a-zA-Z
blank	Space 與 Tab
cntrl	ASCII 0~ASCII 32 的控制字元
lower	所有的小寫字母
upper	所有的大寫字母
space	Space Tab newline linefeed 與 formfeed characters
xdigit	合法的十六進位數字</em></blockquote></pre>

這裡所介紹的 PHP regular expression 與 regular expression 語法都是屬於 POSIX 1003.2 的標準。事實上，PHP 自 3.0.9 開始，就提供了 Perl 型式的 regular expression 函數，所使用的 regular expression 語法也都是屬於 Perl 的型式。熟悉 Perl 的讀者如果對這個主題有興趣，可以參考 PHP 的 Manual。]]>
      
   </content>
</entry>
<entry>
   <title>86. PHP 的 Regular Expression 函數群整理</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_86_php_regular_expression.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.172</id>
   
   <published>2006-10-27T14:10:05Z</published>
   <updated>2006-10-27T14:16:06Z</updated>
   
   <summary>ereg() 函數 int ereg(string pattern, string string, array [regs]); 將符合 pattern 的子字串放到 regs 陣列裡。string 是原字串，pattern 則是用來尋找特定條件的 regular expression，找到的字串則由左而右依序存放到 regs 陣列裡。ereg() 函數在搜尋字串時有大小寫之分。 $regs[0] 存放原來的字串，因此找到的子字串由 $regs[1] 開始存放。底下是幾個簡單的範例： //取出 YYYY-MM-DD 日期格式的數字部份 ereg(&quot;([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})&quot;, $date, $regs )) //將 MMMMMM 每二個一組切開 ereg(&quot;(.{2})(.{2})(.{2})&quot;, $string, $nums); 以第一個範例來看，[0-9] 是一個...</summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.15 PHP 的 Regular Expression" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[<strong>ereg() 函數</strong>

<pre><blockquote><em>int ereg(string pattern, string string, array [regs]);</em></blockquote></pre>

將符合 pattern 的子字串放到 regs 陣列裡。string 是原字串，pattern 則是用來尋找特定條件的 regular expression，找到的字串則由左而右依序存放到 regs 陣列裡。ereg() 函數在搜尋字串時有大小寫之分。

$regs[0] 存放原來的字串，因此找到的子字串由 $regs[1] 開始存放。底下是幾個簡單的範例：

<pre><blockquote><em>//取出 YYYY-MM-DD 日期格式的數字部份
ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs ))
<br />//將 MMMMMM 每二個一組切開
ereg("(.{2})(.{2})(.{2})", $string, $nums);</em></blockquote></pre>

以第一個範例來看，[0-9] 是一個 pattern，[0-9]{4} 也是一個 pattern，我們利用小括弧將多個 pattern 群組成一個 pattern，因此 ([0-9]{4}) 是一個 pattern，將符合這個 pattern 的子字串放到 $regs 陣列裡。這個範例共有 3 個 pattern，因此 $regs[1]、$regs[2] 與 $regs[3] 存放了符合條件的子字串。

相關函數：eregi(), ereg_replace(), eregi_replace()

<strong>ereg_replace() 函數</strong>

<pre><blockquote><em>string ereg_replace(string pattern, string replacement, string string);</em></blockquote></pre>

取代字串的函數。將符合 pattern 條件的子字串取代成 replacement，string 則是則來的字串，最後傳回完成取代後的字串。ereg_replace() 對字串有大小寫之分。

\\0 ~ \\9 是一種很好用的機制，在 pattern 括弧裡的字串會被記憶到 \\0 ~ \\9 裡，在取代時就可以使用 \\0 ~ \\9 表示括弧裡的字串。取代時，依括弧的位置，由左而右，由外而內依序將括弧裡的字串存放至 \\0 ~ \\9 裡。例如：

使用範例：

<pre><blockquote><em>&lt;?php
<br />$string = "This is a test.";
echo ereg_replace(" is", " was", $string). "&lt;br&gt;";
echo ereg_replace("( )is", "\\1was", $string). "&lt;br&gt;";
echo ereg_replace("(( )is)", "\\2was", $string). "&lt;br&gt;";
<br />$html = '&lt;p&gt;&lt;a href="index.php"&gt;回首頁&lt;/a&gt;&lt;/p&gt;';
echo ereg_replace("&lt;([^&gt;]|\n)*&gt;", "", $html); // 去除 HTML 標籤
<br />?&gt;</em></blockquote></pre>

在這個例子裡，ereg_replace("( )is", "\\1was", $string ) 裡的 \\1 為 " " (Space)。ereg_replace("(( )is)", "\\2was", $string) 裡的 \\2 也是 " "，而 \\1 則是 " is"。這有點類似 Perl regular expression 裡括弧的用法。

相關函數：ereg(), eregi(), eregi_replace()

<strong>eregi() 函數</strong>

<pre><blockquote><em>int eregi(string pattern, string string, array [regs]);</em></blockquote></pre>

功能與使用方法和 ereg() 一樣，不過 eregi() 對字串沒有大小寫的分別。

相關函數：ereg(), ereg_replace(), eregi_replace()

<strong>eregi_replace() 函數</strong>

<pre><blockquote><em>string eregi_replace(string pattern, string replacement, string string);</em></blockquote></pre>

功能與使用方法和 ereg_replace() 一樣，不過 eregi_replace() 對字串沒有大小寫的分別。

相關函數：ereg(), eregi(), ereg_replace()

<strong>split() 函數</strong>

<pre><blockquote><em>array split(string pattern, string string, int [limit]);</em></blockquote></pre>

將字串切開成數個子子串。split() 函數以符合 pattern 條件的子字串為邊界，將string 字串切成數個子字串，limit 限定要切割的個數。切割後傳回一個陣列，包含所有被切開的字串。

使用範例：

<pre><blockquote><em>&lt;?php
<br />$passwd_list = `cat /etc/passwd`;
$passwd_list = split( ":", $passwd_list);
<br />for ($i = 0; $i &lt; (count($passwd_list)+1)/7; $i++) {
   echo "&lt;br&gt;\n";
<br />   for ($j = 0; $j &lt; 7; $j++)
      echo $passwd_list[$i*7+$j]. " ";
}
<br />?&gt;</em></blockquote></pre>

要注意一點，split() 函數對於 pattern 與字串是有大小寫之分的。這個範例主要是將 "/etc/passwd" 裡的字串以 ":" 為界切割成數個子字串。

相關函數：explode(), implode()

<strong>sql_regcase() 函數</strong>

<pre><blockquote><em>string sql_regcase(string string);</em></blockquote></pre>

將 regular expression 裡的 pattern 改成沒有大小寫之分的 pattern，常用來將 SQL 裡的 pattern 改成沒有大小寫之分的寫法。例如：

<pre><blockquote><em>echo echo sql_regcase("Jollen");</em></blockquote></pre>

輸出為：

<pre><blockquote><em>[Jj][Oo][Ll][Ll][Ee][Nn]</em></blockquote></pre>

再看一個 sql_regcase() 實際運用的例子：

<pre><blockquote><em>$query = "select * from student where fullname = '". sql_regcase('Chen Jin-Hong'). "'";
echo $qery;</em></blockquote></pre>

輸出為：

<pre><blockquote><em>select * from student where fullname = '[Cc][Hh][Ee][Nn] [Jj][Ii][Nn]-[Hh][Oo][Nn][Gg]'</em></blockquote></pre>

雖然 MySQL 接受這種 regular expression 的寫法，但是筆者並不鼓勵這種寫法，如果只是為了要能判別大小寫夾雜的字串，可以改用這種寫法：

<pre><blockquote><em>select * from student where upper(fullname) = "CHEN JING-HONG"</em></blockquote></pre>]]>
      
   </content>
</entry>
<entry>
   <title>85. 如何加上加上選擇顏色的功能？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_85.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.171</id>
   
   <published>2006-10-27T14:08:57Z</published>
   <updated>2006-10-27T14:09:21Z</updated>
   
   <summary><![CDATA[我們還可以配合 radio box 輸入欄位讓使用者可以選擇不同的顏色。首先必須重新設計我們的表單如下： &lt;form method="POST" action="draw2.php"&gt; &lt;p&gt;X1:&lt;input type="text" name="x1" size="3"&gt;&lt;br&gt; Y1:&lt;input type="text" name="y1" size="3"&gt;&lt;/p&gt; &lt;p&gt;X2:&lt;input type="text" name="x2" size="3"&gt;&lt;br&gt; Y2:&lt;input type="text" name="y2" size="3"&gt;&lt;/p&gt; &lt;p&gt;顏色：&lt;input type="radio" value="0,0,0" name="color" checked&gt;黑 &lt;input type="radio" value="255,0,0" name="color"&gt;&lt;font color="#FF0000"&gt;紅&lt;/font&gt; &lt;input type="radio" value="0,120,0" name="color"&gt;&lt;font color="#008000"&gt;綠&lt;/font&gt; &lt;input type="radio"...]]></summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.14 繪圖函數範例" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[我們還可以配合 radio box 輸入欄位讓使用者可以選擇不同的顏色。首先必須重新設計我們的表單如下：

<pre><blockquote><em>&lt;form method="POST" action="draw2.php"&gt;
  &lt;p&gt;X1:&lt;input type="text" name="x1" size="3"&gt;&lt;br&gt;
  Y1:&lt;input type="text" name="y1" size="3"&gt;&lt;/p&gt;
  &lt;p&gt;X2:&lt;input type="text" name="x2" size="3"&gt;&lt;br&gt;
  Y2:&lt;input type="text" name="y2" size="3"&gt;&lt;/p&gt;
  &lt;p&gt;顏色：&lt;input type="radio" value="0,0,0" name="color" checked&gt;黑 &lt;input
type="radio" value="255,0,0" name="color"&gt;&lt;font color="#FF0000"&gt;紅&lt;/font&gt;
  &lt;input type="radio" value="0,120,0" name="color"&gt;&lt;font
color="#008000"&gt;綠&lt;/font&gt; &lt;input type="radio" value="0,0,120" name="color"&gt;&lt;font
color="#000080"&gt;紫&lt;/font&gt;
  &lt;input type="radio" value="0,0,255" name="color"&gt;&lt;font
color="#0000FF"&gt;藍&lt;/font&gt;&lt;/p&gt;
  &lt;p&gt;&lt;input type="submit" value="畫線" name="B1"&gt;&lt;/p&gt;
&lt;/form&gt;</em></blockquote></pre>

<img alt="php" src="/blog/webreal/3-9.jpg" />
圖: 可選擇顏色的新表單

底下修改後的範例程式 draw2.php，在這個範例裡，我們改用 PNG 格式來輸出圖檔。

<pre><blockquote><em>&lt;?php
<br />// 1.建立新影像
$im = imagecreate(500, 400);
<br />// 2. 定義白色顏色的 RGB (背景顏色)
$white = imagecolorallocate($im, 255, 255, 255);
<br />// 3. 定義使用者選擇的顏色
$rgb = split(",", $color);
$usercol = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);
<br />// 4. 開始畫線
imageline($im, $x1, $y1, $x2, $y2, $usercol);
<br />// 5. 做成 png 圖檔並輸出
imagepng($im, "draw2.png");
<br />// 6. 完成後將圖檔毀滅
imagedestroy($im);
<br />?&gt;
&lt;html&gt;
已輸出至 &lt;a href="draw2.png"&gt;draw2.png&lt;/a&gt;
&lt;/html&gt;</em></blockquote></pre>

在線段的顏色部份，只要把原來定義黑色的程式碼改用由表單傳入的顏色參數來定義線段顏色即可：

<pre><blockquote><em>// 3. 定義使用者選擇的顏色
$rgb = split(",", $color);
$usercol = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);</em></blockquote></pre>

這裡我們也用到了簡單的陣列設計方法。接下來畫線時要記得將顏色的變數改成 這裡的 $usercol：

<pre><blockquote><em>// 4. 開始畫線
imageline($im, $x1, $y1, $x2, $y2, $usercol);</em></blockquote></pre>]]>
      
   </content>
</entry>
<entry>
   <title>84. 如何設計一個簡單的畫線 CGI 程式？</title>
   <link rel="alternate" type="text/html" href="http://www.jollen.org/php/jollen_php_book_84_cgi.html" />
   <id>tag:www2.jollen.org,2006:/blog/webreal//8.170</id>
   
   <published>2006-10-27T14:08:24Z</published>
   <updated>2006-10-27T14:08:50Z</updated>
   
   <summary><![CDATA[底下是一個很簡單的範例，配合 PHP 的繪圖函數群與 CGI 程式設計所製作的畫線程式。我們將利用表單輸入 2 組座標點，並且繪製一條直線。 首先是我們設計的表單： &lt;html&gt; &lt;head&gt; &lt;title&gt;畫線程式&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form method="GET" action="draw.php"&gt; &lt;p&gt;X1:&lt;input type="text" name="x1" size="3"&gt;&lt;br&gt; Y1:&lt;input type="text" name="y1" size="3"&gt;&lt;/p&gt; &lt;p&gt;X2:&lt;input type="text" name="x2" size="3"&gt;&lt;br&gt; Y2:&lt;input type="text" name="y2" size="3"&gt;&lt;/p&gt; &lt;p&gt;&lt;input type="submit" value="畫線" name="B1"&gt;&lt;/p&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt; 圖:...]]></summary>
   <author>
      <name>jollen</name>
      <uri>http://www.jollen.org</uri>
   </author>
         <category term="2.14 繪圖函數範例" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="en" xml:base="http://www.jollen.org/php/">
      <![CDATA[底下是一個很簡單的範例，配合 PHP 的繪圖函數群與 CGI 程式設計所製作的畫線程式。我們將利用表單輸入 2 組座標點，並且繪製一條直線。

首先是我們設計的表單：

<pre><blockquote><em>&lt;html&gt;
<br />&lt;head&gt;
&lt;title&gt;畫線程式&lt;/title&gt;
&lt;/head&gt;
<br />&lt;body&gt;
<br />&lt;form method="GET" action="draw.php"&gt;
  &lt;p&gt;X1:&lt;input type="text" name="x1" size="3"&gt;&lt;br&gt;
  Y1:&lt;input type="text" name="y1" size="3"&gt;&lt;/p&gt;
  &lt;p&gt;X2:&lt;input type="text" name="x2" size="3"&gt;&lt;br&gt;
  Y2:&lt;input type="text" name="y2" size="3"&gt;&lt;/p&gt;
  &lt;p&gt;&lt;input type="submit" value="畫線" name="B1"&gt;&lt;/p&gt;
&lt;/form&gt;
<br />&lt;/body&gt;
<br />&lt;/html&gt;</em></blockquote></pre>

<img alt="php" src="/blog/webreal/3-7.jpg" />
圖: 畫線的 HTML 輸入表單

接下來則是我們畫線的 CGI 程式，請注意表單裡面我們到用了 hidden 輸入欄位的設計方式。底下是畫線的主程式 draw.php：

<pre><blockquote><em>&lt;?php
<br />// 1.建立新影像
$im = imagecreate(500, 400);
<br />// 2. 定義白色顏色的 RGB (背景顏色)
$white = imagecolorallocate($im, 255, 255, 255);
<br />// 3. 定義黑色的 RGB (線的顏色)
$black = imagecolorallocate($im, 0, 0, 0);
<br />// 4. 開始畫線
imageline($im, $x1, $y1, $x2, $y2, $black);
<br />// 5. 做成 png 圖檔並輸出
imagejpeg($im, "draw.jpg");
<br />// 6. 完成後將圖檔毀滅
imagedestroy($im);
<br />?&gt;
&lt;html&gt;
已輸出至 &lt;a href="draw.jpg"&gt;draw.jpg&lt;/a&gt;
&lt;/html&gt;</em></blockquote></pre>

由於版權問題，PHP 已經不再支援 GIF 格式的圖檔，所以這裡我們改用了 JPEG 格式的圖檔。接下來讓我們開始測試畫線的 CGI 程式。

輸入 (1, 1)-(35, 70) 的座標後，可以看到圖 3.8 的結果 (draw.jpg)。

<img alt="php" src="/blog/webreal/3-8.jpg" />
圖: 畫線程式的輸出結果]]>
      
   </content>
</entry>

</feed>