2009年11月2日 星期一

設定 session 的過期時間 & 暫存檔過多

刪除這些過期的 Session 檔案

<?php
function start_session($expire = 0)
{
    if ($expire == 0) {
        $expire = ini_get('session.gc_maxlifetime');
    } else {
        ini_set('session.gc_maxlifetime', $expire);
     }

    if (empty($_COOKIE['PHPSESSID'])) {
        session_set_cookie_params($expire);
        session_start();
    } else {
        session_start();
        setcookie('PHPSESSID', session_id(), time() + $expire);
     }
}
?>




 

2009年10月15日 星期四

Apache performance way

提高Apache效能的幾個方法

////////////////////////////////////
.KeepAlive On 
讓同一個TCP連線狀態來提供一個以上的服務要求,當網頁有很多圖片時,可讓網站效能提高。


.MaxKeepAliveRequest 0
限制每次連線要求服務的上限,0表示無限制,數字越大效能越高。

.KeepAliveTimeout 15
在持續的連接中,Apache等待服務要求的時間。

.MinSpareServers 15
This is the minimum number of spare servers you want running at any given time. This way, if multiple simultaneous requests are received there will already be child processes running to handle them. Setting this number too high is a waste of system resources and setting it too low will cause the system to slow down.

.MaxSpareServers 65

.StartServers 15
預先啟動的伺服器行程數量,當常駐Apache行程被啟動時,有15個行程將開始跑起來,準備好來提供服務。
15 spare servers will run up to the maximum of 64.

.MaxClients 150
同時可允許啟動的行程數量,如果有超過150位的同時連線,則應該提高這個上限。
 I think 500 is about right for most people's needs.

.MaxRequestPerChild 10000
為了讓記憶體緩衝能夠更新,則要限制每一個伺服器行程所能提供的要求服務,當提供10000次要求後,這個行程就會被Kill。
Sets the maximum number of requests each child process will handle. This is mostly to prevent memory leaks and other mishaps but is important nonetheless. Setting this too low will cause a large portion of child processes to end for no real reason, thus slowing down the site. This could be set to 0 (unlimited) but that would negate any protection from valid issues like memory leaks.

.HostnameLookups Off
用使用者端的IP位址去名稱伺服器DNS查詢主機名稱,為避免浪費網路資源,請關閉,除非要作網站資源使用的統計分析,才會打開此指令。
//////////////////////////////////////////////////////


At least when you are running Apache as your webserver on top of a FreeBSD box, you have a lot of possibilities to tune your system in order to achieve more performance.

Like on most operating systems the TCP/IP listen queue is often the first limit hit. It restricts the pending TCP requests. The second important parameter is the number of mbuf clusters which could be increased. Additionally you can increase the maximum number of allowed child processes and open file descriptors. So, for a heavily loaded machine increase these values in your kernel config via:

   maxusers 256
   options  SOMAXCONN=256
   options  NMBCLUSTERS=4096
   options  CHILD_MAX=512
   options  OPEN_MAX=512
Additionally you can try to use maximum optimization when building the kernel itself by using the GCC compiler flags
   -mpentium -O2 -fexpensive-optimizations -fomit-frame-pointer
or even try to compile the kernel with the latest EGCS-based Pentium-GCC variant. But please be carefully here, always keep a working kernel at hand when doing such optimization tests.
After tuning your operating system you can try to enhance the performance of Apache. In addition to the above kernel parameters you now first can increase the corresponding Apache parameters when building:

  -DHARD_SERVER_LIMIT=256
  -DDYNAMIC_MODULE_LIMIT=0
  -DBUFFERED_LOGS
And then you can tune the Apache configuration accordingly:
  MinSpareServers   256
  StartServers      256
  MaxSpareServers   256
  MaxClients        256
Additionally you can increase Apaches performance again by tuning some more parameters:
  MaxRequestsPerChild  10000
  KeepAlive            on
  KeepAliveTimeout     15
  MaxKeepAliveRequests 64
  Timeout              400
  IdentityCheck        off
  HostnameLookups      off
  <Files ~ "\.(html|cgi)$>
      HostnameLookups on
  </Files>
  <Directory />
      Options FollowSymLinks
      AllowOverride None
  </Directory>

2009年9月28日 星期一

在mysql中直接去除空白或是行

update table_name set col_name = replace(col_name,'\n','')  
update table_name set col_name = replace(col_name,' ','')  

資料庫中針對carchar 排列
select * from XXX ORDER BY CAST(`A` AS DECIMAL(10,2)) DESC;

2009年9月4日 星期五

如何在部落格加入購物車或訂購單

前一篇有寫道 BeClass提供的免費線上報名系統,
讓我想到其他應用還蠻廣的

目前很多人把商品暫時擺在部落格(營業規模還沒到可以自行開站維持)
但是其中訂購方式卻大多是採電話或是下載後傳真,EMAIL等。
其實運用報BeClass就可完成簡易的訂購系統

基本操作請看 如何在部落格加入線上報名表功能 利用自訂表單功能
我剛剛在YAM隨便找了一個網站(非廣告)
http://blog.yam.com/jasperbaby/article/18762006

如果你想用一個如此的團購或是訂購網
其實可以試試如下
>>新增一個快捷報名表,記住報名表欄位用自訂的!!



自訂表格










然後就可以自己設計一些表格欄位啦
有一些是常用的,直接勾取就好




自定欄位2





















然後再設計一些必要選項,就完成一個簡易的團購表啦!!


然後記得要選 "表格管理"
 來看看高度是否可以,如果有出現"拉霸",請調整高度


表格應用
















最後把崁入網址 COPY 到你的網頁,注意要調整的就是下列的高度值,要調整好會比較美觀!!

<iframe width="710" height="550" frameborder="0" marginheight="0" marginwidth="0" scrolling="auto" src="XXX"></iframe>

完成後就像下面的啦!!

http://www.beclass.com/default.php?name=ShowList&op=regist&registid=132b6014c0ef06dc05c0

2009年9月2日 星期三

如何在部落格加入線上報名表功能

現在BLOG的普及,就像家庭擁有的轎車數一樣,多的可能有3-4個部落格。
現今大多的活動或報導幾乎都被PO上部落格,不過似乎還少了點什麼!!??

沒錯!! 就是報名系統,舉凡郊遊活動,朋友網友聚餐,同學會等,目前部落格報名方式還是使用留言來替代,今天要介紹一個可以產生真正的報名表網站,它不是提供部落格,而是產生ifram崁入你的網站中,就像Youtube一樣將報名表崁入網頁中。

網站:BeClass 活動發佈系統+活動報名系統

廢話不多說,來看看如何做吧!!進入 BeClass 活動發佈系統+活動報名系統

當然要先註冊啦!!  很容易,主要是要有email就可以了。

登入後點選快捷報名表吧



登入後畫面















只要輸入活動名稱,點選活動日期,再加一個報名表欄位就可以了,
剛開始建議用預設第一個就好了,設定好後再回來更改成你要的報名表就可以了
還蠻方便的

 
輸入資料

































按下最下方的儲存後,會跳出成功的畫面,

這時要記得按 "啟用"喔!!


上傳成功並啟用







這樣就算大功告成了!!

然後點選 快捷報名表管理, 你會發現剛剛輸入的活動,點選最右邊的表格應用
(如果找不到,看看是不是在暫停活動那邊)
當然你也可以預覽一下表格的樣子!!


表格應用





最後會出來你剛剛設計的表格(好像沒有設計到,因為是採用預設一的表格)


表格應用2

















看到最右邊有一個崁入!! 沒錯,只要把那一行網址 copy到你的部落格
以html原始檔方式加入就可以了
結果就像下面顯示啦!!



2009年8月21日 星期五

IE & FireFox 的整合

W3C說是一個標準,不如說是一個麻煩,
以下細節只針對IE和FireFox,其它瀏覽器並未測試 

1.DOCTYPE影響CSS處理 

2.FF: div設置margin-left, margin-right為auto時已經居中, IE不行 

3.FF: body設置text-align時, div需要設置margin: auto(主要是margin-left,margin-right)方可居中 

4.FF:設置padding後, div會增加height和width,但IE不會,故需要用!important多設一個height和width 

5.FF:支持!important, IE則忽略,可用!important為FF特別設置樣式 

6.div的垂直居中問題: vertical-align:middle;將行距增加到和整個DIV一樣高line-height:200px;然後插入文字,就垂直居中了。 缺點是要控制內容不要換行 

7.cursor: pointer可以同時在IE FF中顯示游標手指狀, hand僅IE可以 

8.FF:鏈接加邊框和背景色,需設置display: block,同時設置float: left保證不換行。 參照menubar,給a和menubar設置高度是為了避免底邊顯示錯位,若不設height,可以在menubar中插入一個空格。 

9.在mozilla firefox和IE中的BOX模型解釋不一致導致相差2px解決方法: 
div{margin:30px!important;margin:28px;} 
注意這兩個margin的順序一定不能寫反,據阿捷的說法!important這個屬性IE不能識別,但別的瀏覽器可以識別。 所以在IE下其實解釋成這樣: 
div{maring:30px;margin:28px} 
重複定義的話按照最後一個來執行,所以不可以只寫margin:XXpx!important; 

10.IE5和IE6的BOX解釋不一致IE5下 
div{width:300px;margin:0 10px 0 10px;} 
div的寬度會被解釋為300px-10px(右填充)-10px(左填充)最終div的寬度為280px,而在IE6和其他瀏覽器上寬度則是以300px+10px(右填充)+10px(左填充)=320px來計算的。 這時我們可以做如下修改 
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px} 
關於這個/**/是什麼我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的話,請告訴我一聲,謝了!:) 

11.ul標籤在Mozilla中默認是有padding值的,而在IE中只有margin有值所以先定義 
ul{margin:0;padding:0;} 
就能解決大部分問題 

12.對div設置水平居中對齊時,要給子div加上一句"margin:auto"以兼容FireFox瀏覽器 

13.當div的佈局並沒有如text-align設置的那樣排列時,嘗試用float來實現 

14.將<p>標籤的樣式改成:margin:0px;line-height:XXpx,避免在FireFox瀏覽器下發生一些意想不到的結果 

15.想要消除ul、ol等列表的縮進時,樣式應寫成:list-style:none;margin:0px;padding:0px;,其中margin屬性對IE有效,padding屬性對FireFox有效 

16.padding 5px 4px 3px 1px FireFox無法解釋簡寫,必須改成padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px; 

注意事項: 

1、float的div一定要閉合。 

例如:(其中floatA、floatB的屬性已經設置為float:left;) 
<#div id="floatA" ></#div> 
<#div id="floatB" ></#div> 
<#div id="NOTfloatC" ></#div> 
這裡的NOTfloatC並不希望繼續平移,而是希望往下排。 
這段代碼在IE中毫無問題,問題出在FF。 原因是NOTfloatC並非float標籤,必須將float標籤閉合。 
 
<#div class="floatB"></#div> 
<#div class="NOTfloatC"></#div> 
之間加上 
<#div class="clear"></#div> 
這個div一定要注意聲明位置,一定要放在最恰當的地方,而且必須與兩個具有float屬性的div同級,之間不能存在嵌套關係,否則會產生異常。 
並且將clear這種樣式定義為為如下即可: 
.clear{ 
clear:both;} 
此外,為了讓高度能自動適應,要在wrapper裡面加上overflow:hidden; 
當包含float的box的時候,高度自動適應在IE下無效,這時候應該觸發IE的layout私有屬性(萬惡的IE啊!)用zoom:1;可以做到,這樣就達到了兼容。 
例如某一個wrapper如下定義: 
.colwrapper{ 
overflow:hidden; 
zoom:1; 
margin:5px auto;} 

2、margin加倍的問題。 

設置為float的div在ie下設置的margin會加倍。 這是一個ie6都存在的bug。 
解決方案是在這個div裡面加上display:inline; 
例如: 

<#div id="imfloat"></#div> 


相應的css為 

#IamFloat{ 
float:left; 
margin:5px;/*IE下理解為10px*/ 
display:inline;/*IE下再理解為5px*/} 

3、關於容器的包涵關係 

很多時候,尤其是容器內有平行佈局,例如兩、三個float的div時,寬度很容易出現問題。 在IE中,外層的寬度會被內層更寬的div擠破。 一定要用Photoshop或者Firework量取像素級的精度。 

4、關於高度的問題 

如果是動態地添加內容,高度最好不要定義。 瀏覽器可以自動伸縮,然而如果是靜態的內容,高度最好定好。 (似乎有時候不會自動往下撐開,不知道具體怎麼回事) 

5、最狠的手段- !important; 

如果實在沒有辦法解決一些細節問題,可以用這個方法.FF對於"!important"會自動優先解析,然而IE則會忽略.如下 
.tabd1{ 
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/ 
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */} 
值得注意的是,一定要將xxxx !important這句放置在另一句之上,上面已經提過 

2009年8月11日 星期二

UNICODE的一些處理方式

/* 將 文字 轉換成 '12345' 或 '&#12345;' */

// 使用 iconv
$unicode = base_convert(bin2hex(iconv('UTF-8', 'UCS-4', $string)), 16, 10);

// 使用 mb_convert_encoding
$unicode = base_convert(bin2hex(mb_convert_encoding($string, 'ucs-4', 'utf-8')), 16, 10);

// 補上 &#xxxxx;
$unicode = '&#' . base_convert(bin2hex(iconv("utf-8", "ucs-4", $str)), 16, 10) . ';'; 

// 將 &#12345 轉回 文字
$string = mb_convert_encoding($unicode, 'UTF-8', 'HTML-ENTITIES'); 

$str = "温"; $unicodeHtml = base_convert(bin2hex(iconv("utf-8", "ucs-2", $str)), 16, 10); print "&#".$unicodeHTML.";" // 顯示結果 &#28201;


unicode html 轉回文字,由於 php 沒有 hex2bin 的函式,所以我們自己簡單的寫一個來用。

<?php function hex2bin($string) {     $len = strlen($string);     retunr pack("H".$len, $string); } $str = "28201"; $unicodeHtml = iconv("ucs-2", "utf-8", hex2bin(base_convert($str, 10, 16))); print $unicodeHtml; // 顯示結果 温
?>

線上轉換網站


/////////////////////////////////////////////////////////////////////////
//
// UTF-8轉換為UNICODE
//
//
/////////////////////////////////////////////////////////////////////////

function numeric_code_utf8($utf8_string) { 
$out = ""; 
$ns = strlen ($utf8_string); 
for ($nn = 0; $nn < $ns; $nn++) { 
$ch = $utf8_string[$nn]; 
$ii = ord ($ch); 

if ($ii < 128) 
        $out .= $ch; 
else if ($ii >>5 == 6) { 
$b1 = ($ii & 31); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b2 = ($ii & 63); 
$ii = ($b1 * 64) + $b2; 
$ent = sprintf ("&#%d;", $ii); 
$out .= $ent; 
else if ($ii >>4 == 14) { 
$b1 = ($ii & 31); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b2 = ($ii & 63); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b3 = ($ii & 63); 
$ii = ((($b1 * 64) + $b2) * 64) + $b3; 
$ent = sprintf ("&#%d;", $ii); 
$out .= $ent; 
else if ($ii >>3 == 30) { 
$b1 = ($ii & 31); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b2 = ($ii & 63); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b3 = ($ii & 63); 
$nn++; 
$ch = $utf8_string [$nn]; 
$ii = ord ($ch); 
$b4 = ($ii & 63); 
$ii = ((((($b1 * 64) + $b2) * 64) + $b3) * 64) + $b4; 
$ent = sprintf ("&#%d;", $ii); 
$out .= $ent; 
return $out; 
}


function BIG5_string($name){

 //判別中文是否能轉換為BIG5碼,若不行則以unicode&#XXXX顯示
 
$tname=@iconv("utf-8","big5",$name);
if( mb_strlen($name,"utf-8")  <>  mb_strlen($tname,"big5")  )
{
$per_name_big5="";
for($ai=0;$ai < mb_strlen($name,"UTF-8");$ai++)
{
$str_tmp=mb_substr($name,$ai,1,"UTF-8");
$str_tmp_big5=@iconv("utf-8","big5",$str_tmp);
if( mb_strlen($str_tmp_big5,"big5") ==0 )
{
echo "$str_tmp <br>";
$per_name_big5 .=  "&#".base_convert(bin2hex(iconv("utf-8", "ucs-2", $str_tmp)), 16, 10);
}
else $per_name_big5 .=$str_tmp_big5;    
}
}else $per_name_big5=$name;




  return $per_name_big5;
}

2009年7月30日 星期四

免費張活動資訊

一個新的網站
提供大家發佈活動消息
還提供報名表功能
還可以匯出EXCEL檔

http://www.beclass.com

2009年6月5日 星期五

ModSecurity 的一些網站

http://support.oss.org.tw/wiki/index.php/ModSecurity#.E7.B0.A1.E4.BB.8B


ModSecurity-2.5.7手册翻译
http://blog.chinaunix.net/u2/83080/showart_1413910.html


Rules

基礎

語法:SecRule VARIABLES OPERATOR [ACTIONS]

  1. VARIABLES:指定哪些變數要進行處理
  2. OPERATOR:要如何處理這些變數取得我們想要的
  3. ACTIONS (optional):當達到上述的處理時,要做什麼動作

Rule處理的階段

Mod Security會在http的五個transaction進行處理,分別是Phase:1-Request Headers、Phase:2-Request Body、Phase:3-Response Headers、Phase:4-Response Body、Phase:5-logging。

因此,在rule的部分即可指定你要transaction的哪一部份進行處理。

 

VARIABLES

一些常見的變數:

  • ARGS、ARGS_NAMES、ARGS_GET、ARGS_GET_NAMES、ARGS_POST、ARGS_POST_NAMES
  • AUTH_TYPE
  • REQBODY_PROCESSOR、REQBODY_PROCESSOR_ERROR
  • FILES、FILES_NAMES、FILE_SIZES
  • REMOTE_ADDR、REMOTE_HOST、REMOTE_PORT
  • REQUEST_BODY、REQUEST_COOKIES、REQUEST_COOKIES_NAMES、REQUEST_FILENAME
  • RESPONSE_BODY

Rule中的變數部分可以一個以上, 以”|”來區隔即可,如果設定的規則超過多行,則可用”\”來進行分隔。

 

OPERATOR

預設的OPERATOR是正規表示法(Regular Expression),但其實ModSecurity提供不少可用的OPERATOR,利用”@”即可指定要用何種OPERATOR,例如SecRule REQUEST_URI “@rx iii”。

以下是一些範例:

  • SecRule REMOTE_ADDR "^192\.168\.1\.101$"
    • REMOTE_ADDR:指定變數對象為遠端連線的IP位址
    • "^192\.168\.1\.101$":針對上述的變數進行比對,如果非192.168.1.101,則符合,可指定要做何種動作
  • SecRule ARGS "@validateUtf8Encoding"
    • ARGS:指定變數為http傳遞的參數
    • "@validateUtf8Encoding":指定OPERATOR為對這些參數進行Utf8編碼進行檢查
  • SecRule FILES_TMPNAMES "@inspectFile /path/to/inspect_script.pl"
    • FILES_TMPNAMES:指定變數為上傳檔案的暫存名稱
    • "@inspectFile /path/to/inspect_script.pl":指定利用inspect_script.pl檔案的語法來檢查上傳檔案

 

ACTIONS

指定如果VARIABLE有符合OPERATOR的情況時,要執行何種動作。ACTIONS主要區分為五種型態:

  • Disruptive actions (中斷目前的transaction)
    • deny、drop、redirect、proxy、pause…
  • Non-disruptive actions (改變狀態)
    • Append、auditlog、exec…
  • Flow actions (改變規則流動)
    • allow、chain、pass、skip…
  • Meta-data actions (包含規則的metadata)
    • id、rev、severity、msg、phase、log, nolog、…
  • Data actions (可放置內容給其他action用)
    • capture、status、t、xmlns…

 

使用範例1

SecRule REQBODY_PROCESSOR_ERROR "!@eq 0“ "phase:2,log,deny,msg:'Failed to parse request body.',severity:2“
說明:

  • REQBODY_PROCESSOR_ERROR:指定針對request body發生的processor發生的錯誤的代碼
  • "!@eq 0“:當不等於0時,即有錯誤發生時
  • 處理動作 "phase:2,log,deny,msg:'Failed to parse request body.',severity:2“
    • phase:2:由於對象為request body,因此指定在phase:2進行
    • log:當情況符合(發生錯誤),將錯誤log起來
    • deny:將這個transaction拒絕
    • msg:'Failed to parse request body':網頁上並顯示出這樣的錯誤訊息
    • severity:2:將此狀況列為嚴重程度為2

使用範例2

SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \
"phase:2,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"

說明:

  • MULTIPART_UNMATCHED_BOUNDARY:指定針對multipart發生unmatched boundary的錯誤
  • "!@eq 0“:當不等於0時,即有錯誤發生時
  • 處理動作 "phase:2,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"
    • phase:2:由於對象為request body,因此指定在phase:2進行
    • log:當情況符合(發生錯誤),將錯誤log起來
    • deny:將這個transaction拒絕
    • msg:'Multipart parser detected a possible unmatched boundary.':網頁上並顯示出這樣的錯誤訊息

The Core rule sets

這是由Breach Security所寫的一般常用到的防護規則,為GPL v2。

此一系列的規則可防護一般網頁應用程式常見已知的弱點或其他未知的弱點。這一系列的規則使用下列的技術:

  • HTTP protection
    • Detect all abnormal HTTP request
  • Common Web Attacks Protection
    • SQL Injection、Cross-Site Scripting (XSS) …
  • Automation detection
    • crawler
  • Trojan Protection
  • Error Hiding
    • Detect errors sent by the web server

 

 

2009年5月3日 星期日

表單隱藏

運用javascript 將不必要的資訊隱藏(display:none)
因為IE不支援TABLE的getElementById 及getElementByName
所以採用 document.getElementsByTagName('tr').getAttribute("name")
來處理!!



function activate_tab()
{
document.getElementById('XXX').style.display='inline';
var e = document.getElementsByTagName('tr'); 
for(i = 0; i < e.length; i++) { 
if(e[i].getAttribute("name") == 'XXX'    )  e[i].style.display='none';

}

<tr name="XXX">
<td align=center>$data['area']</td>

另一版本

getElementsByName:function (name) { 
var returns = document.getElementsByName(name); 
if(returns.length > 0) return returns; 
returns = new Array(); 
var e = document.getElementsByTagName('tr'); 
for(i = 0; i < e.length; i++) { 
e[i].style.display='none';
if(e[i].getAttribute("name") == name) { 
returns[returns.length] = e[i]; 
return returns; 





///////////////////////////////////////////////////////////
function activate_tab(tab,all_tabs)
{
var tabs = all_tabs.split('|');
var parts = tab.split('.');
var last_part = parts.length-1;
for (n = 0; n < tabs.length; n++)
{
var t = tabs[n];

if (t.indexOf('.') < 0 && parts.length > 1) 
{
parts[last_part] = t;
t = parts.join('.');
}
document.getElementById(t).style.display = t == tab ? 'inline' : 'none';
document.getElementById(t+'-tab').className = 'etemplate_tab'+(t == tab ? '_active th' : ' row_on');
}
}
<table  class="TabHeader"><tr ><td  onclick="activate_tab('calendar.edit.general','general|description|links');" id="calendar.edit.general-tab" onmouseover="self.status='時間,...'; return true;" onmouseout="self.status=''; return true;" class="etemplate_tab_active">常规 </td>
<td  onclick="activate_tab('calendar.edit.links','general|description|links',);" id="calendar.edit.links-tab" onmouseover="self.status='連結'; return true;" onmouseout="self.status=''; return true;" class="etemplate_tab">链接 </td>
<div  style="display: none;" id="calendar.edit.link">...</div>

2009年2月26日 星期四

正規表示式

哪些符號是必須要被脫逸掉的特殊符號呢?

\   +   [   ]   .   ^   $   *   ?   (   )   |


驗證URL

(!preg_match("/^(https?:\/\/+[\w\-]+\.[\w\-]+)/i",$url))

身分證字號(china)

$match='/^\d{6}((1[89])|(2\d))\d{2}((0\d)|(1[0-2]))((3[01])|([0-2]\d))\d{3}(\d|X)$/i')
else if(strlen($v)>18) return false;
手機 $match='/^[(86)|0]?(13\d{9})|(15\d{9})|(18\d{9})$/'



通用式

說明及範例

比對不成立之字串

/a/

含字母 "a" 的字串,例如 "ab", "bac", "cba"

"xyz"

/a./

含字母 "a" 以及其後任一個字元的字串,例如 "ab", "bac"(若要比對.,請使用 \.)

"a", "ba"

/^xy/

以 "xy" 開始的字串,例如 "xyz", "xyab"(若要比對 ^,請使用 \^)

"axy", "bxy"

/xy$/

以 "xy" 結尾的字串,例如 "axy", "abxy"以 "xy" 結尾的字串,例如 "axy", "abxy" (若要比對 $,請使用 \$)

"xya", "xyb"

[13579]

包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy"

"y2k"

[0-9]

含數字之字串

不含數字之字串

[a-z0-9]

含數字或小寫字母之字串

不含數字及小寫字母之字串

[a-zA-Z0-9]

含數字或字母之字串

不含數字及字母之字串

b[aeiou]t

"bat", "bet", "bit", "bot", "but"

"bxt", "bzt"

[^0-9]

不含數字之字串(若要比對 ^,請使用 \^)

含數字之字串

[^aeiouAEIOU]

不含母音之字串(若要比對 ^,請使用 \^)

含母音之字串

[^\^]

不含 "^" 之字串,例如 "xyz", "abc"

"xy^", "a^bc"

 

字元

說明

簡單範例

\

避開特殊字元

/A\*/ 可用於比對 "A*",其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 "\"

^

比對輸入列的啟始位置

/^A/ 可比對 "Abcd" 中的 "A",但不可比對 "aAb"

$

比對輸入列的結束位置

/A$/ 可比對 "bcdA" 中的 "A",但不可比對 "aAb"

*

比對前一個字元零次或更多次

/bo*/ 可比對 "Good boook" 中的 "booo",亦可比對 "Good bk" 中的 "b"

+

比對前一個字元一次或更多次,等效於 {1,}

/a+/ 可比對 "caaandy" 中的 "aaa",但不可比對 "cndy"

?

比對前一個字元零次或一次

/e?l/ 可比對 "angel" 中的 "el",也可以比對 "angle" 中的 "l"

.

比對任何一個字元(但換行符號不算)

/.n/ 可比對 "nay, an apple is on the tree" 中的 "an" 和 "on",但不可比對 "nay"

(x)

比對 x 並將符合的部分存入一個變數

/(a*) and (b*)/ 可比對 "aaa and bb" 中的 "aaa" 和 "bb",並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。

xy

比對 x 或 y

/a*b*/g 可比對 "aaa and bb" 中的 "aaa" 和 "bb"

{n}

比對前一個字元 n 次,n 為一個正整數

/a{3}/ 可比對 "lllaaalaa" 其中的 "aaa",但不可比對 "aa"

{n,}

比對前一個字元至少 n 次,n 為一個正整數

/a{3,}/ 可比對 "aa aaa aaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa"

{n,m}

比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數

/a{3,4}/ 可比對 "aa aaa aaaa aaaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa" 及 "aaaaa"

[xyz]

比對中括弧內的任一個字元

/[ecm]/ 可比對 "welcome" 中的 "e" 或 "c" 或 "m"

[^xyz]

比對不在中括弧內出現的任一個字元

/[^ecm]/ 可比對 "welcome" 中的 "w"、"l"、"o",可見出其與 [xyz] 功能相反。(同時請同學也注意 /^/ 與 [^] 之間功能的不同。)

[\b]

比對退位字元(Backspace character)

可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別

\b

比對英文字的邊界,例如空格

例如 /\bn\w/ 可以比對 "noonday" 中的 ‘no’ ;
/\wy\b/ 可比對 "possibly yesterday." 中的 ‘ly’

\B

比對非「英文字的邊界」

例如, /\w\Bn/ 可以比對 "noonday" 中的 ‘on’ , 
另外 /y\B\w/ 可以比對 "possibly yesterday." 中的 ‘ye’

\cX

比對控制字元(Control character),其中 X 是一個控制字元

/\cM/ 可以比對一個字串中的 control-M

\d

比對任一個數字,等效於 [0-9]

/[\d]/ 可比對由 "0" 至 "9" 的任一數字但其餘如字母等就不可比對

\D

比對任一個非數字,等效於 [^0-9]

/[\D]/ 可比對 "w" "a"… 但不可比對如 "7" "1" 等數字

\f

比對 form-feed

若是在文字中有發生 "換頁" 的行為則可以比對成功

\n

比對換行符號

若是在文字中有發生 "換行" 的行為則可以比對成功

\r

比對 carriage return

 

\s

比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v]

/\s\w*/ 可比對 "A b" 中的 "b"

\S

比對任一個非空白字元,等效於 [^ \f\n\r\t\v]

/\S/\w* 可比對 "A b" 中的 "A"

\t

比對定位字元(Tab)

 

\v

比對垂直定位字元(Vertical tab)

 

\w

比對數字字母字元(Alphanumerical characters)或底線字母("_"),等效於 [A-Za-z0-9_]

/\w/ 可比對 ".A _!9" 中的 "A"、"_"、"9"。

\W

比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]

/\W/ 可比對 ".A _!9" 中的 "."、" "、"!",可見其功能與 /\w/ 恰好相反。

\ooctal

比對八進位,其中octal是八進位數目

/\oocetal123/ 可比對與八進位的ASCII中 "123" 所相對應的字元值。

\xhex

比對十六進位,其中hex是十六進位數目

/\xhex38/ 可比對與 16進位的ASCII中 "38" 所相對應的字元。




來源已經忘記了,如果有侵犯版權麻煩請通知

RegularExpresson基礎教學
^ 匹配字元串的開始
$ 匹配字元串的結束
ex
"^The": 開頭一定要有"The"字元串; 
"of despair$": 結尾一定要有"of despair" 的字元串; 
那麼
"^abc$": 就是要求以abc開頭和以abc結尾的字元串,實際上是只有abc匹配 
"notice": 匹配「包含」notice的字元串 
你可以看見如果你沒有用我們提到的兩個字符(最後一個例子),可以出現下被檢驗字元串的任何地方,你沒有把他鎖定到兩邊 

* 相當於{0,} zero or more
+ 相當於{1,} one or more
? 相當於{0,1} zero or one 
要點, '*', '+',和 '?'只管它前面那個字符.
ex
"ab*": 和ab{0,}同義,匹配以a開頭,後面可以接0個或者N個b組成的字元串("a", "ab", "abbb", 等); 
"ab+": 和ab{1,}同義,同上條一樣,但最少要有一個b存在 ("ab", "abbb", 等.); 
"ab?":和ab{0,1}同義,可以沒有或者只有一個b; 
"a?b+$": 匹配以一個或者0個a再加上一個以上的b結尾的字元串. 


{ } 限制字符出現的個數
ex
"ab{2}": 要求a後面一定要跟兩個b(一個也不能少)("abb"); 
"ab{2,}": 要求a後面一定要有兩個或者兩個以上b(如"abb", "abbbb", 等.); 
"ab{3,5}": 要求a後面可以有2-5個b("abbb", "abbbb", or "abbbbb"). 
( ) 幾個字符放到小括號裡
ex
"a(bc)*": 匹配 a 後面跟0個或者一個"bc"; 
"a(bc){1,5}": 一個到5個 "bc." 

還有一個字符 '│', 相當於OR 操作: 

"hi│hello": 匹配含有"hi" 或者 "hello" 的 字元串; 
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字元串; 
"(a│b)*c": 匹配含有這樣多個(包括0個)a或b,後面跟一個c 
的字元串; 

一個點('.')可以代表所有的單一字符,不包括"\n"
如果,要匹配包括"\n"在內的所有單個字符,怎么辦?
對了,用'[\n.]'這種模式.

"a.[0-9]": 一個a加一個字符再加一個0到9的數字 
"^.{3}$": 三個任意字符結尾 . 


中括號括住的內容只匹配一個單一的字符 

"[ab]": 匹配單個的 a 或者 b ( 和 "a│b" 一樣); 
"[a-d]": 匹配'a' 到'd'的單個字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個大小寫英文
"^[a-zA-Z]": 匹配以大小寫字母開頭的字元串 
"[0-9]%": 匹配含有 形如 x% 的字元串 
",[a-zA-Z0-9]$": 匹配以逗號再加一個數字或字母結尾的字元串 

你也可以把你不想要得字符列在中括號裡,你只需要在總括號裡面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個百分號裡面有一個非字母的字元串. 
要點:^用在中括號開頭的時候,就表示排除括號裡的字符 
為了PHP能夠解釋,你必須在這些字符面前後加'',並且將一些字符轉義. 
不要忘記在中括號裡面的字符是這條規路的例外─在中括號裡面, 所有的特殊字符,包括(''), 都將失去他們的特殊性質 "[*\+?{}.]"匹配含有這些字符的字元串.
還有,正如regx的手冊告訴我們: "如果清單裡含有 ']', 最好把它作為清單裡的第一個字符(可能跟在'^'後面). 如果含有'-', 最好把它放在最前面或者最後面, or 或者一個範圍的第二個結束點[a-d-0-9]中間的‘-’將有效. 
看了上面的例子,你對{n,m}應該理解了吧.要注意的是,n和m都不能為負整數,而且n總是小於m. 這樣,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"將匹配 "pvpppppp"中的前五個p
下面說說以\開頭的
\b 書上說他是用來匹配一個單字邊界,就是...比如've\b',可以匹配love裡的ve而不匹配very裡有ve
\B 正好和上面的\b相反.例子我就不舉了
.....突然想起來....可以到http://www.phpv.net/article.php/251 看看其它用\ 開頭的語法

好,我們來做個應用:
如何構建一個模式來匹配 貨幣數量 的輸入 
構建一個匹配模式去檢查輸入的訊息是否為一個表示money的數字。
我們認為一個表示money的數量有四種模式︰ "10000.00" 和 "10,000.00",或者沒有小數部分, "10000" and "10,000". 
現下讓我們開始構建這個匹配模式: 
^[1-9][0-9]*$ 
這是所變量必須以非0的數字開頭.但這也意味著 單一的 "0" 也不能透過測試. 以下是解決的方法: 
^(0│[1-9][0-9]*)$ 
"只有0和不以0開頭的數字與之匹配",我們也可以允許一個負號在數字之前: 
^(0│-?[1-9][0-9]*)$ 
這就是: "0 或者 一個以0開頭 且可能 有一個負號在前面的數字." 好了,現下讓我們別那麼嚴謹,
允許以0開頭.現下讓我們放棄 負號 , 因為我們在表示錢幣的時候並不需要用到. 我們現下指定 模式 用來匹配小數部分: 
^[0-9]+(\.[0-9]+)?$ 
這暗示匹配的字元串必須最少以一個阿拉伯數字開頭. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道為什麼嗎) 
^[0-9]+(\.[0-9]{2})?$ 
我們上面指定小數點後面必須有兩位小數.如果你認為這樣太苛刻,你可以改成: 
^[0-9]+(\.[0-9]{1,2})?$ 
這將允許小數點後面有一到兩個字符. 現下我們加上用來增加可讀性的逗號(每隔三位), 我們可以這樣表示: 
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$ 
不要忘記 '+' 可以被 '*' 替代 如果你想允許空白字元串被輸入話 (為什麼?). 也不要忘記反斜杆 ’\’ 在php字元串中可能會出現錯誤 (很普遍的錯誤). 
現下,我們已經可以確認字元串了, 我們現下把所有逗號都去掉 str_replace(",", "", $money) 然後在把類型看成 double然後我們就可以透過他做數學計算了. 

再來一個:
構造檢查email的正則表達式 
在一個完整的email位址中有三個部分: 
1. 用戶名 (在 [email]'@'[/email] 左邊的一切), 
[email=2.]2.'@'[/email],
3. 伺服器名(就是剩下那部分). 
用戶名可以含有大小寫字母阿拉伯數字,句號 ('.'), 減號('-'), and 下劃線 ('_'). 伺服器名字也是符合這個規則,當然下劃線除外. 
現下, 用戶名的開始和結束都不能是句點. 伺服器也是這樣. 還有你不能有兩個連續的句點他們之間至少存在一個字符,好現下我們來看一下怎么為用戶名寫一個匹配模式: 
^[_a-zA-Z0-9-]+$ 
現下還不能允許句號的存在. 我們把它加上: 
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$ 
上面的意思就是說: "以至少一個規範字符(除了.)開頭,後面跟著0個或者多個以點開始的字元串." 
簡單化一點, 我們可以用 eregi()取代 ereg().eregi()對大小寫不敏感, 我們就不需要指定兩個範圍 "a-z" 和 "A-Z" 只需要指定一個就可以了: 
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$ 
後面的伺服器名字也是一樣,但要去掉下劃線: 
^[a-z0-9-]+(\.[a-z0-9-]+)*$ 
好. 現下只需要用”@”把兩部分連接: 
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ 

這就是完整的email認証匹配模式了,只需要調用 
eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil) 
就可以得到是否為email了 
正則表達式的其他用法 
提取字元串 
ereg() and eregi() 有一個特性是允許用戶透過正則表達式去提取字元串的一部分(具體用法你可以閱讀手冊). 比如說,我們想從 path/URL 提取檔案名 下面的代碼就是你需要: 
ereg("([^\\/]*)$", $pathOrUrl, $regs); 
echo $regs[1]; 
進階的代換 
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負號都替換成逗號: 

ereg_replace("[ \n\r\t]+", ",", trim($str));
檢查EMAIL的正則表達式
"^[-!#$% \'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$% \'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$% \'*+\\./0-9=?A-Z^_`a-z{|}~]+$"

通用式

說明及範例

比對不成立之字串

/a/

含字母 "a" 的字串,例如 "ab", "bac", "cba"

"xyz"

/a./

含字母 "a" 以及其後任一個字元的字串,例如 "ab", "bac"(若要比對.,請使用 \.)

"a", "ba"

/^xy/

以 "xy" 開始的字串,例如 "xyz", "xyab"(若要比對 ^,請使用 \^)

"axy", "bxy"

/xy$/

以 "xy" 結尾的字串,例如 "axy", "abxy"以 "xy" 結尾的字串,例如 "axy", "abxy" (若要比對 $,請使用 \$)

"xya", "xyb"

[13579]

包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy"

"y2k"

[0-9]

含數字之字串

不含數字之字串

[a-z0-9]

含數字或小寫字母之字串

不含數字及小寫字母之字串

[a-zA-Z0-9]

含數字或字母之字串

不含數字及字母之字串

b[aeiou]t

"bat", "bet", "bit", "bot", "but"

"bxt", "bzt"

[^0-9]

不含數字之字串(若要比對 ^,請使用 \^)

含數字之字串

[^aeiouAEIOU]

不含母音之字串(若要比對 ^,請使用 \^)

含母音之字串

[^\^]

不含 "^" 之字串,例如 "xyz", "abc"

"xy^", "a^bc"

 

字元

說明

簡單範例

\

避開特殊字元

/A\*/ 可用於比對 "A*",其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 "\"

^

比對輸入列的啟始位置

/^A/ 可比對 "Abcd" 中的 "A",但不可比對 "aAb"

$

比對輸入列的結束位置

/A$/ 可比對 "bcdA" 中的 "A",但不可比對 "aAb"

*

比對前一個字元零次或更多次

/bo*/ 可比對 "Good boook" 中的 "booo",亦可比對 "Good bk" 中的 "b"

+

比對前一個字元一次或更多次,等效於 {1,}

/a+/ 可比對 "caaandy" 中的 "aaa",但不可比對 "cndy"

?

比對前一個字元零次或一次

/e?l/ 可比對 "angel" 中的 "el",也可以比對 "angle" 中的 "l"

.

比對任何一個字元(但換行符號不算)

/.n/ 可比對 "nay, an apple is on the tree" 中的 "an" 和 "on",但不可比對 "nay"

(x)

比對 x 並將符合的部分存入一個變數

/(a*) and (b*)/ 可比對 "aaa and bb" 中的 "aaa" 和 "bb",並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。

xy

比對 x 或 y

/a*b*/g 可比對 "aaa and bb" 中的 "aaa" 和 "bb"

{n}

比對前一個字元 n 次,n 為一個正整數

/a{3}/ 可比對 "lllaaalaa" 其中的 "aaa",但不可比對 "aa"

{n,}

比對前一個字元至少 n 次,n 為一個正整數

/a{3,}/ 可比對 "aa aaa aaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa"

{n,m}

比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數

/a{3,4}/ 可比對 "aa aaa aaaa aaaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa" 及 "aaaaa"

[xyz]

比對中括弧內的任一個字元

/[ecm]/ 可比對 "welcome" 中的 "e" 或 "c" 或 "m"

[^xyz]

比對不在中括弧內出現的任一個字元

/[^ecm]/ 可比對 "welcome" 中的 "w"、"l"、"o",可見出其與 [xyz] 功能相反。(同時請同學也注意 /^/ 與 [^] 之間功能的不同。)

[\b]

比對退位字元(Backspace character)

可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別

\b

比對英文字的邊界,例如空格

例如 /\bn\w/ 可以比對 "noonday" 中的 ‘no’ ;
/\wy\b/ 可比對 "possibly yesterday." 中的 ‘ly’

\B

比對非「英文字的邊界」

例如, /\w\Bn/ 可以比對 "noonday" 中的 ‘on’ , 
另外 /y\B\w/ 可以比對 "possibly yesterday." 中的 ‘ye’

\cX

比對控制字元(Control character),其中 X 是一個控制字元

/\cM/ 可以比對一個字串中的 control-M

\d

比對任一個數字,等效於 [0-9]

/[\d]/ 可比對由 "0" 至 "9" 的任一數字但其餘如字母等就不可比對

\D

比對任一個非數字,等效於 [^0-9]

/[\D]/ 可比對 "w" "a"… 但不可比對如 "7" "1" 等數字

\f

比對 form-feed

若是在文字中有發生 "換頁" 的行為則可以比對成功

\n

比對換行符號

若是在文字中有發生 "換行" 的行為則可以比對成功

\r

比對 carriage return

 

\s

比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v]

/\s\w*/ 可比對 "A b" 中的 "b"

\S

比對任一個非空白字元,等效於 [^ \f\n\r\t\v]

/\S/\w* 可比對 "A b" 中的 "A"

\t

比對定位字元(Tab)

 

\v

比對垂直定位字元(Vertical tab)

 

\w

比對數字字母字元(Alphanumerical characters)或底線字母("_"),等效於 [A-Za-z0-9_]

/\w/ 可比對 ".A _!9" 中的 "A"、"_"、"9"。

\W

比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_]

/\W/ 可比對 ".A _!9" 中的 "."、" "、"!",可見其功能與 /\w/ 恰好相反。

\ooctal

比對八進位,其中octal是八進位數目

/\oocetal123/ 可比對與八進位的ASCII中 "123" 所相對應的字元值。

\xhex

比對十六進位,其中hex是十六進位數目

/\xhex38/ 可比對與 16進位的ASCII中 "38" 所相對應的字元。




來源已經忘記了,如果有侵犯版權麻煩請通知

RegularExpresson基礎教學
^ 匹配字元串的開始
$ 匹配字元串的結束
ex
"^The": 開頭一定要有"The"字元串; 
"of despair$": 結尾一定要有"of despair" 的字元串; 
那麼
"^abc$": 就是要求以abc開頭和以abc結尾的字元串,實際上是只有abc匹配 
"notice": 匹配「包含」notice的字元串 
你可以看見如果你沒有用我們提到的兩個字符(最後一個例子),可以出現下被檢驗字元串的任何地方,你沒有把他鎖定到兩邊 

* 相當於{0,} zero or more
+ 相當於{1,} one or more
? 相當於{0,1} zero or one 
要點, '*', '+',和 '?'只管它前面那個字符.
ex
"ab*": 和ab{0,}同義,匹配以a開頭,後面可以接0個或者N個b組成的字元串("a", "ab", "abbb", 等); 
"ab+": 和ab{1,}同義,同上條一樣,但最少要有一個b存在 ("ab", "abbb", 等.); 
"ab?":和ab{0,1}同義,可以沒有或者只有一個b; 
"a?b+$": 匹配以一個或者0個a再加上一個以上的b結尾的字元串. 


{ } 限制字符出現的個數
ex
"ab{2}": 要求a後面一定要跟兩個b(一個也不能少)("abb"); 
"ab{2,}": 要求a後面一定要有兩個或者兩個以上b(如"abb", "abbbb", 等.); 
"ab{3,5}": 要求a後面可以有2-5個b("abbb", "abbbb", or "abbbbb"). 
( ) 幾個字符放到小括號裡
ex
"a(bc)*": 匹配 a 後面跟0個或者一個"bc"; 
"a(bc){1,5}": 一個到5個 "bc." 

還有一個字符 '│', 相當於OR 操作: 

"hi│hello": 匹配含有"hi" 或者 "hello" 的 字元串; 
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字元串; 
"(a│b)*c": 匹配含有這樣多個(包括0個)a或b,後面跟一個c 
的字元串; 

一個點('.')可以代表所有的單一字符,不包括"\n"
如果,要匹配包括"\n"在內的所有單個字符,怎么辦?
對了,用'[\n.]'這種模式.

"a.[0-9]": 一個a加一個字符再加一個0到9的數字 
"^.{3}$": 三個任意字符結尾 . 


中括號括住的內容只匹配一個單一的字符 

"[ab]": 匹配單個的 a 或者 b ( 和 "a│b" 一樣); 
"[a-d]": 匹配'a' 到'd'的單個字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個大小寫英文
"^[a-zA-Z]": 匹配以大小寫字母開頭的字元串 
"[0-9]%": 匹配含有 形如 x% 的字元串 
",[a-zA-Z0-9]$": 匹配以逗號再加一個數字或字母結尾的字元串 

你也可以把你不想要得字符列在中括號裡,你只需要在總括號裡面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個百分號裡面有一個非字母的字元串. 
要點:^用在中括號開頭的時候,就表示排除括號裡的字符