<?php
    /**
     * session使用memcached Aboc QQ:9986584
     */


     class Session{

          //过期时间
          private $_LEFT_TIME = 3600;
          
          //当前时间
          private $_nowtime = 0;
          
          //过期的确切时间
          private $_expiry = 0;

          private $_sessionid = '';
          
          private $_memcached_host = MEMCACHEDHOST;
          private $_memcached_port = MEMCACHEDPORT;
          public $mem;
          
          public function open() {
              $this->_nowtime = time();
              $this->_expiry = $this->_nowtime+$this->_LEFT_TIME;
              if (isset($_COOKIE['PHPSESSID'])){
                $this->_sessionid = $_COOKIE['PHPSESSID'];
                //session_id($this->_sessionid);
                $this->write_sessionid($this->_sessionid);
            } else {
                /**
                 * 要弄一个唯一的值才可以
                 */
                $tempsessionid = md5($_SERVER['REMOTE_ADDR'].$this->getIp().$_SERVER['HTTP_USER_AGENT'].rand(100000,999999));
                $this->write_sessionid($tempsessionid);
                $this->_sessionid = $tempsessionid;
                session_id($this->_sessionid);
            }
            $this->mem = new Memcache;
            $this->mem->connect($this->_memcached_host,$this->_memcached_port);      
         }
         
         /**
          * 设置过期时间,秒
          * Enter description here ...
          * @param unknown_type $seconds
          */
        public function setLefttime($seconds=3600){
            $this->_LEFT_TIME = $seconds;
        }
          
         private function getIp() {
        if (isset ( $_SERVER )) {
            if (isset ( $_SERVER ["HTTP_X_FORWARDED_FOR"] )) {
                $realip = $_SERVER ["HTTP_X_FORWARDED_FOR"];
            } else if (isset ( $_SERVER ["HTTP_CLIENT_IP"] )) {
                $realip = $_SERVER ["HTTP_CLIENT_IP"];
            } else {
                $realip = $_SERVER ["REMOTE_ADDR"];
            }
        } else {
            if (getenv ( "HTTP_X_FORWARDED_FOR" )) {
                $realip = getenv ( "HTTP_X_FORWARDED_FOR" );
            } else if (getenv ( "HTTP_CLIENT_IP" )) {
                $realip = getenv ( "HTTP_CLIENT_IP" );
            } else {
                $realip = getenv ( "REMOTE_ADDR" );
            }
        }
        if(isset($realip[16]))$realip = substr($realip,0,15);
        return $realip;
        }
          
          /**
           * 将自定义的sessionid写入cookie
           *
           * @param unknown_type $sessionid
           */
          private function write_sessionid($sessionid){
              setcookie('PHPSESSID',$sessionid,$this->_expiry,'/');              
          }

          public function close(){

          }

          /**
           * 读
           */
          public function read() {
              //echo $this->_sessionid;
              $content =$this->mem->get($this->_sessionid);
              if ($content){
                  return $content;
              }else{
                  $this->mem->set($this->_sessionid,'',0,$this->_LEFT_TIME);
                  return false;
              }
          }

          /**
           * 写
           */
          public function write( $sessionid , $sessdata ) {
             $this->mem->replace($this->_sessionid,$sessdata,0,$this->_LEFT_TIME);
               return true;
          }
          
          /**
           * 指定销毁
           */
          public function destroy() {
              $this->mem->delete($this->_sessionid);
          }

          /**
           * 销毁过期的数据
           */
          public function gc() {
                  //         
          }
          
          
          public function __destruct(){
              //$this->gc();
          }

     }

     $session  = new Session();
     session_set_save_handler(
                 array(&$session,'open'),
                 array(&$session,'close'),
                 array(&$session,'read'),
                 array(&$session,'write'),
                 array(&$session,'destroy'),
                 array(&$session,'gc')
     );
     session_start();
?>

2012-1-30 18:24 Monday  

今天更新了一下smarty到3.0,结果发现项目中的__autoload()不能用了,原来是因为smarty改变了autoload的方式。

解决方法如下:

function autoload($className){
    if (file_exists(SITEROOT.'include/module/'.$className.'.class.php'))
    include SITEROOT.'include/module/'.$className.'.class.php';
    else
    die('类'.$className.'文件不存在');
}
spl_autoload_register("autoload");

用上面的方式还可以依顺序同时载入几个autoload方法哦

<?php
/**
 * PHP操作mssql数据库类,含分页类
 * Enter description here ...
 * @author aboc 9986584 2011-04-09
 *
 */
class DB_Handle{
var $ClassName = "DB_Handle";

var $Server;
var $UserName;
var $Password;
var $Database;

var $LinkID=0;
var $QueryResult="";
var $LastInsertID = "";

//* private ignore=>ignore the error and continue, halt=>report the error and halt, report=>report the error and continue
var $Halt_On_Error = "report";

var $Error = "";
var $ErrNo = 0;

var $total = 0;
var $page = 0;
var $page_num = 10;
var $page_size = 10;
var $page_name = 'page';

//* remark: This is the db_mysql_class's structure     * function: Set the server,username,password,database variable.
function DB_Handle($server="",$username="",$password="",$database=""){
    $this->Server = $server;
    $this->UserName = $username;
    $this->Password = $password;
    $this->Database = $database;    
}

    //* function: Connect database and select database    * success: retun 1    * failed: return 0
function connect(){
    $this->LinkID = @mssql_pconnect($this->Server,$this->UserName,$this->Password);
    if(!$this->LinkID){
    $this->halt("mssql_pconnect($this->Server,$this->UserName,$this->Password): Failed");
    return 0;
    }
    if(!@mssql_select_db($this->Database)){
    $this->halt("mssql_select_db($this->Database) Failed.");
    return 0;
    }
    return 1;
}
//* function: Check the database, if exist then select        * exist: return 1        * not exist: return 0
function selectDatabase(){
    if(@mssql_select_db($this->Database))
    return 1;
    else
    return 0;
}
//* function: Execute SQL instruction    * success: return SQL Result.    * failed: return 0;
function execQuery($sql=""){
    if($this->LinkID == 0){
    $this->halt("Execute SQL Failed: Hava not valid database connect.");
    return 0;
    }
    ob_start();
    $this->QueryResult = mssql_query($sql,$this->LinkID);
    $error = ob_get_contents();
    ob_end_clean();
    if($error){
    $this->halt("Execute SQL: mssql_query($sql,$this->LinkID) failed.");
    return 0;
    }
    $reg = "#insert into#";
    if(preg_match($reg,$sql)){
    $sql = "select @@IDENTITY as id";
    $res = mssql_query($sql,$this->LinkID);
    $this->LastInsertID = mssql_result($res,0,id);
    }
    return $this->QueryResult;
}
//* function: Get the query result's row number//* success: return the row fo the Result//* failed: return 0
function getTotalRowNum($result=""){
    if($result != "") $this->QueryResult = $result;
    $row = @mssql_num_rows($this->QueryResult);
    if($row >= 0) return $row;
    $this->halt("Get a row of result Failed: Result $result is invalid.");
    return 0;
}
//* function: Get the last insert record's id    //* success: return id        //* failed: return 0
function lastInsertID(){
    return $this->LastInsertID;
}
//* function: Get a field's value    * success: return value of the field        * failed: return 0
function getField($result="",$row=0,$field=0){
    if($result != "") $this->QueryResult = $result;
    $fieldvalue = @mssql_result($this->QueryResult,$row,$field);
    if($fieldvalue != "") return $fieldvalue;
    $this->halt("Get field: mssql_result($this->QueryResult,$row,$field) failed.");
    return 0;
   //Here should have error handle
}
//* function: Get next record    * success: return a array of the record's value            * failed: return 0
function nextRecord($result=""){
    if($result != "") $this->QueryResult = $result;
    $record = @mssql_fetch_array($this->QueryResult);
    if(is_array($record)){
        foreach ($record as $key=>$row)
        $record[$key] = trim($row);
        return $record;
    }
    //$this->halt("Get the next record Failed: the Result $result is invalid.");
    return 0;
}
//* function: Free the Query Result    * success return 1   * failed: return 0
function freeResult($result=""){
    if($result != "") $this->QueryResult = $result;
    return @mssql_free_result($this->QueryResult);
}
//* function: Set the Halt_On_Error's state     * success: return 1    * failed: return 0
function setHaltOnError($state="ignore"){
    if(!($state == "ignore" || $state == "report" || $state == "halt")){
    $this->halt("Set the Halt_On_Error Fail: There is no state value $state");
    return 0;       
    }
    $this->Halt_On_Error = $state;
    return 1;
}
//* function: Get the Halt_On_Error's state
function getHaltOnError(){
    return $this->Halt_On_Error;
}
//* function: Get the class's name
function toString(){
    return $this->ClassName;
}
//* function: Error handle
function halt($msg){
    $this->Error = @mysql_error($this->LinkID);
    $this->ErrNo = @mysql_errno($this->LinkID);
    if ($this->Halt_On_Error == "ignore") return;
    $this->makeMsg($msg);
    if ($this->Halt_On_Error == "halt") die("Session halted");
}

//* function: Make error information and print
function makeMsg($msg){
    printf("Database error: %s
\n", $msg);
    printf("MySQL Error: %s (%s)
\n",$this->ErrNo,$this->Error);
}
/**
 * 以下为分页类
 */

    private function getQuery(){
        $query = '';
        if( isset($_GET) && is_array($_GET)){
            foreach ($_GET as $key=>$value){
                if ($key == 'page')continue;
                $query .= !empty($query)?'&'.$key.'='.$value:$key.'='.$value;
            }
        }
        $query .= empty($query)?'':'&';
        return $this->getFilename().$query;
    }
    
    /**
     * 获取当前的url文件名并带上?
     */
    private function getFilename() {
        //$filename = str_replace($_SERVER['QUERY_STRING'],'',basename($_SERVER["REQUEST_URI"]));
        $filename = str_replace('?'.$_SERVER['QUERY_STRING'],'',basename($_SERVER["REQUEST_URI"])).'?';
        return $filename;
    }
    
    /**
     * 返回带分页名的连接字符
     */
    private function returnPageLink( $page ){
        return $this->getQuery().$this->page_name.'='.$page;
    }

    /**
     * 下一页链接
     */
    function nextPageLink(){
        if( $this->page != $this->page_num )
        return $this->returnPageLink($this->page+1);
        else
        return '#';
    }    

   function getListData($sql,$num=10){
       $this->execQuery($sql);
       $this->page_num = $this->getTotalRowNum();
       if (!$this->page_num || !$num )return array();
       $this->page_size = $num;
       $this->page = isset($_GET[$this->page_name])?intval($_GET[$this->page_name]):1;
       $pageTotal = ceil($this->page_num/$num);
       if ($this->page < 0)$this->page = 0;
       if ($this->page > $pageTotal) $this->page = $pageTotal;
       $list = array();
       if (mssql_data_seek($this->QueryResult, ($this->page-1)*$this->page_size)){
           for ($i=0;$i<$num;$i++){
               $list[] = $this->nextRecord();
           }           
       }
       return $list;
   }


    /**
     * 输出中文分页链接 上一页,下一页
     *
     * @return unknown
     */
    function pagelist( $total='总共',$dataname='条',$now='当前',$page='页',$first='第一页',$last='尾页',$prev='上一页',$next='下一页' ){
        $total='<span>'.$total.$this->page_size.$dataname.' '.$now.($this->page).'/'.($this->page_num).$page.'</span>';
        $startpage='<a href="'.$this->returnPageLink(1).'">'.$first.'</a>';
        $endpage='<a href="'.$this->returnPageLink($this->page_num).'">'.$last.'</a>';
        if($this->page == 1){
            $prepage='<span>'.$prev.'</span>';
        }else{
            $prepage='<a href="'.$this->returnPageLink($this->page-1).'">'.$prev.'</a>';
        }
        if($this->page==$this->page_num){
            $nextpage='<span>'.$next.'</span>';
        }else{
            $nextpage='<a href="'.$this->returnPageLink($this->page+1).'">'.$next.'</a>';
        }
        if($this->page_size == 0)return '';
        return $total.' '.$startpage.' '.$prepage.' '.$nextpage.' '.$endpage;
    }
    
    /**
     * 输出下拉框的列表
     *
     */
    function select() {
        $select = '<select name="pageselect" id="pageselect"  onchange="window.location=\''.$this->getQuery().$this->page_name.'=\'+pageselect.value">';
        $totalnum = $this->page_num;
        for($i=1;$i<=$totalnum;$i++) {
            if($this->page == $i){
                $str = ' selected="selected"';
            } else {
                $str = '';
            }
            $select .= '<option value="'.$i.'"'.$str.'>'.$i.'</option>';
        }
        $select .= '</select>';
        if($this->page_size == 0)$select = '';
        return $select;        
    }

    /**
     * 输入页数到多少页
     *
     */
    function gotoPage($buttonname='到'){
        $string = '<input type="text" size="3" name="dm_pagenum"><input type="button" value="'.$buttonname.'" onclick="window.location=\''.$this->getQuery().$this->page_name.'=\'+dm_pagenum.value"> ';
        if($this->page_size == 0)$string = '';
        return $string;
    }
    
    function pageListBaidu($first='首页',$pre_page='上一页',$next_page='下一页',$last='尾页' ,$shownum=6) {
        if($this->page_num == 1) return;
        $pagelink = '';
        if($this->page != 1) {
            $pagelink .= '[<a href="'.$this->returnPageLink(1).'">'.$first.'</a>]&nbsp;';
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page-1).'">'.$pre_page.'</a>]&nbsp;';
        }
        for ($i=$shownum;$i>=1;$i--) {
            $tmp_page = $this->page - $i;
            if( $tmp_page >= 1 ) {
                $pagelink .= '[<a href="'.$this->returnPageLink($tmp_page).'">'.$tmp_page.'</a>]&nbsp;';
            }
        }
        $pagelink .= '<span>'.$this->page.'</span>';
        for ($i=1;$i<=$shownum;$i++) {
            $tmp_page = $this->page + $i;
            if( $tmp_page <= $this->page_num ) {
                $pagelink .= '[<a href="'.$this->returnPageLink($tmp_page).'">'.$tmp_page.'</a>]&nbsp;';
            }
        }        
        
        if( $this->page != $this->page_num ){
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page+1).'">'.$next_page.'</a>]&nbsp;';
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page_num).'">'.$last.'</a>]';
        }
        if($this->num == 0)$pagelink = '';
        return $pagelink;   
    }


}

一,getimagesize不知道为什么在本地会很慢,注释掉就可以了

二,关于这个用网上说的方法吧

php环境兼容性问题--
内容编码错误
无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。
请联系网站的所有者以告知此问题。

以前也遇到过同样的问题,记得是PHP代码ob_start('ob_gzhandler')导致的,导致的原因有两种,

1. 服务器不支持这种压缩格式,可使用function_exists('ob_gzhandler')判断,解决方法 ob_start('ob_gzhandler')改为ob_start();
2. 使用ob_start('ob_gzhandler')时候前面已经有内容输出,检查前面内容以及require include调用文件的内容。若无法找到可以在调用其它文件前使用ob_start(),调用之后使用 ob_end_clean () 来清除输出的内容;

在 调用ob_start();前加入 ob_end_clean () 

   还有一点需要注意的是,PHP5.30版本,默认不再支持<?=$username;?>这样的语法,输出变量需使用& lt;?php echo $username;?>语法才可以。你可以通过将 php.ini 中的 short_open_tag 设置为 On,这样就可以兼容原来的语法。

2012-1-30 18:02 Monday  
基本上导出的文件分为两种:
1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存,通常会提示你是否要转换成Excel文件。
优点:简单。
缺点:难以生成格式,如果用来导入需要自己分别编写相应的程序。
2:Excel格式,与类Excel相对应,这种方法生成的文件更接近于真正的Excel格式。

如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312:
$yourStr = mb_convert_encoding("gb2312", "UTF-8", $yourStr);

一、PHP导入Excel

1:还是用PHPExcel,官方网站: http://www.codeplex.com/PHPExcel。

2:使用PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader
举例:
<?php
require_once 'Excel/reader.php';

// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();

// Set output Encoding.
$data->setOutputEncoding('utf8');

$data->read(' jxlrwtest.xls');


error_reporting(E_ALL ^ E_NOTICE);

for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
    for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
        echo "\"".$data->sheets[0]['cells'][$i][$j]."\",";
    }
    echo "\n";
}

?>

总结 php导出Excel php导入Excel PhpExcel使用说明 PhpExcel使用手册

方法一:特点,简单,省心,制表符"\t"用户分割同一行中的列,换行符"\t\n"可以开启下一行,还能够自动识别日期格式,货币格式等!

<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");
//输出内容如下:
echo   "姓名"."\t";
echo   "年龄"."\t";
echo   "学历"."\t";
echo   "\n";
echo   "张三"."\t";
echo   "25"."\t";
echo   "本科"."\t";
?>
动态版
<?
$sql = "SELECT * FROM " .$ecs->table('member'). " ";
$classres = $db->Execute($sql);
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment; filename=test_data.xls");
echo 'ID'.chr(9);
echo 'txtPEOClientCode'.chr(9);
echo 'jcompany'.chr(9);
echo 'fcompany'.chr(9);
echo 'ecompany'.chr(9);
echo 'rcompany'.chr(9);
echo 'txtAddress'.chr(9);
echo 'txtCompanyTel'.chr(9);
echo 'txtFax'.chr(9);
echo 'txtPostCode'.chr(9);
echo chr(13);
while ($classrow = $classres->FetchRow())
{
//输出到xls
     echo $classrow['id'].chr(9);
     echo $classrow['txtPEOClientCode'].chr(9);
     echo $classrow['jcompany'].chr(9);
     echo $classrow['fcompany'].chr(9);
     echo $classrow['ecompany'].chr(9);
     echo $classrow['rcompany'].chr(9);
     echo $classrow['txtAddress'].chr(9);
     echo $classrow['txtCompanyTel'].chr(9);
     echo $classrow['txtFax'].chr(9);
     echo $classrow['txtPostCode'].chr(9);
     echo chr(13);
}

现在用的Php-excel(http://code.google.com/p/php-excel/downloads/list),代码也很简单:

require (dirname (__FILE__) . "./class-excel-xml.inc.php");
$sql = "SELECT * FROM " .$ecs->table('member'). " ";
$classres = $db->Execute($sql);

while($classrow = $classres->FetchRow())
{
$doc[] =   array ($classrow['txtPEOClientCode'], $classrow['jcompany'], $classrow['txtBillTo']);
}


$xls = new Excel_XML;
$xls->addArray($doc);
$xls->generateXML("mytest");

我用的utf-8,结果有乱码问题,把class-excel-xml.inc.php utf8_encode($v) 替换成$v就没有乱码问题了。


1:第一推荐无比风骚的PHPExcel,官方网站: http://www.codeplex.com/PHPExcel
导入导出都成,可以导出office2007格式,同时兼容2003。
下载下来的包中有文档和例子,大家可以自行研究。
抄段例子出来:

http://www.codeplex.com/PHPExcel

<?php
ini_set("display_errors",1);//是否显示报错信息
ini_set('include_path', ini_get('include_path').';D:\\PHP\\PHPExcel 1.6.6\\Tests\\classes\\');//设置此页面包含路径

include "classes/PHPExcel.php";
include "classes/PHPExcel/Writer/Excel5.php";

//创建一个excel
$objPHPExcel = new PHPExcel();
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);

$objWriter->save("xxx.xls");
?>

--------------------------------------------------------------------------------------
<?
//设置PHPExcel类库的include path
set_include_path('.'. PATH_SEPARATOR .'D:\workspace\biznaligy_eh\dev_src\includes\PHPExcel' . PATH_SEPARATOR . get_include_path());
   
/**
    * 以下是使用示例,对于以 //// 开头的行是不同的可选方式,请根据实际需要
   * 打开对应行的注释。
* 如果使用 Excel5 ,输出的内容应该是GBK编码。
   */
   require_once 'PHPExcel.php';
   require_once 'PHPExcel/Writer/Excel5.php';     // 用于其他低版本xls

   require_once 'PHPExcel/Writer/Excel2007.php'; // 用于 excel-2007 格式

// 创建一个处理对象实例
   $objExcel = new PHPExcel();

// 创建文件格式写入对象实例, uncomment
   $objWriter = new PHPExcel_Writer_Excel5($objExcel);     // 用于其他版本格式
   //or
//$objWriter = new PHPExcel_Writer_Excel2007($objExcel); // 用于 2007 格式
//$objWriter->setOffice2003Compatibility(true);


//设置文档基本属性
   $objProps = $objExcel->getProperties();
   $objProps->setCreator("Zeal Li");
   $objProps->setLastModifiedBy("Zeal Li");
   $objProps->setTitle("Office XLS Test Document");
    $objProps->setSubject("Office XLS Test Document, Demo");
   $objProps->setDescription("Test document, generated by PHPExcel.");
   $objProps->setKeywords("office excel PHPExcel");
    $objProps->setCategory("Test");
   //设置当前的sheet索引,用于后续的内容操作。
//一般只有在使用多个sheet的时候才需要显示调用。
//缺省情况下,PHPExcel会自动创建第一个sheet被设置SheetIndex=0
   $objExcel->setActiveSheetIndex(0);

    $objActSheet = $objExcel->getActiveSheet();

//设置当前活动sheet的名称
    $objActSheet->setTitle('测试Sheet');


//设置单元格内容

//由PHPExcel根据传入内容自动判断单元格内容类型
    $objActSheet->setCellValue('A1', '字符串内容'); // 字符串内容
    $objActSheet->setCellValue('A2', 26);            // 数值
    $objActSheet->setCellValue('A3', true);          // 布尔值
    $objActSheet->setCellValue('A4', '=SUM(A2:A2)'); // 公式

//显式指定内容类型
   $objActSheet->setCellValueExplicit('A5', '847475847857487584', PHPExcel_Cell_DataType::TYPE_STRING);

   //合并单元格
    $objActSheet->mergeCells('B1:C22');

   //分离单元格
    $objActSheet->unmergeCells('B1:C22');
  
//设置单元格样式

   //设置宽度
   $objActSheet->getColumnDimension('B')->setAutoSize(true);
   $objActSheet->getColumnDimension('A')->setWidth(30);

    $objStyleA5 = $objActSheet->getStyle('A5');
  
//设置单元格内容的数字格式。

//如果使用了 PHPExcel_Writer_Excel5 来生成内容的话,
//这里需要注意,在 PHPExcel_Style_NumberFormat 类的 const 变量定义的
//各种自定义格式化方式中,其它类型都可以正常使用,但当setFormatCode
   //为 FORMAT_NUMBER 的时候,实际出来的效果被没有把格式设置为"0"。需要
   //修改 PHPExcel_Writer_Excel5_Format 类源代码中的 getXf($style) 方法,
//在 if ($this->_BIFF_version == 0x0500) { (第363行附近)前面增加一
   //行代码:
//if($ifmt === '0') $ifmt = 1;

//设置格式为PHPExcel_Style_NumberFormat::FORMAT_NUMBER,避免某些大数字
//被使用科学记数方式显示,配合下面的 setAutoSize 方法可以让每一行的内容
   //都按原始内容全部显示出来。
   $objStyleA5 ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER);

//设置字体
    $objFontA5 = $objStyleA5->getFont();
    $objFontA5->setName('Courier New');
    $objFontA5->setSize(10);
    $objFontA5->setBold(true);
    $objFontA5->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
    $objFontA5->getColor()->setARGB('FF999999');

//设置对齐方式
    $objAlignA5 = $objStyleA5->getAlignment();
    $objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
    $objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

//设置边框
   $objBorderA5 = $objStyleA5->getBorders();
   $objBorderA5->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
   $objBorderA5->getTop()->getColor()->setARGB('FFFF0000'); // color
   $objBorderA5->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
   $objBorderA5->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
   $objBorderA5->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

//设置填充颜色
   $objFillA5 = $objStyleA5->getFill();
   $objFillA5->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
   $objFillA5->getStartColor()->setARGB('FFEEEEEE');

//从指定的单元格复制样式信息.
    $objActSheet->duplicateStyle($objStyleA5, 'B1:C22');

//添加图片
   $objDrawing = new PHPExcel_Worksheet_Drawing();
   $objDrawing->setName('ZealImg');
   $objDrawing->setDescription('Image inserted by Zeal');
   $objDrawing->setPath('./zeali.net.logo.gif');
   $objDrawing->setHeight(36);
   $objDrawing->setCoordinates('C23');
   $objDrawing->setOffsetX(10);
   $objDrawing->setRotation(15);
   $objDrawing->getShadow()->setVisible(true);
   $objDrawing->getShadow()->setDirection(36);
   $objDrawing->setWorksheet($objActSheet);

//添加一个新的worksheet
   $objExcel->createSheet();
   $objExcel->getSheet(1)->setTitle('测试2');

//保护单元格
   $objExcel->getSheet(1)->getProtection()->setSheet(true);
   $objExcel->getSheet(1)->protectCells('A1:C22', 'PHPExcel');

//输出内容

   $outputFileName = "output.xls";
//到文件
////$objWriter->save($outputFileName);
//or
//到浏览器
   header("Content-Type: application/force-download");
   header("Content-Type: application/octet-stream");
   header("Content-Type: application/download");
   header('Content-Disposition:inline;filename="'.$outputFileName.'"');
   header("Content-Transfer-Encoding: binary");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
   header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
   header("Pragma: no-cache");
   $objWriter->save('php://output');
?>
2012-1-30 18:02 Monday  

起因:
公司购买的shopex程序取得商业授权认证失败,对方程序员弄了个测试代码来表明是由于我对服务器的设置有问题导致的。

原代码:

$fp = fsockopen(http://www.shopex.cn/, 80, $errno, $errstr, 30);

错误提示:

$fp = fsockopen("http://www.shopex.cn/", 80, $errno, $errstr, 30);
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.shopex.cn/:80 (Unable to find the socket transport "http" – did you forget to enable it when you configured PHP?) in D:\xampp\htdocs\mediashop_cn\test.php on line 2
Unable to find the socket transport "http" – did you forget to enable it when you configured PHP? (24)

解决:

1.修改代码为:

$fp = fsockopen("www.shopex.cn", 80, $errno, $errstr, 30);

$fp = fsockopen("tcp://www.shopex.cn", 80, $errno, $errstr, 30);

参考:
http://uk.php.net/manual/en/function.fsockopen.php
http://uk.php.net/manual/en/transports.php

2.设置服务器防火墙允许服务器访问外部网站,至少允许访问www.shopex.cn

2012-1-30 17:54 Monday  
如果是用的smarty,出现页面空白不报错的话,在$smarty->display("index.tpl");前输出正常的话,有可能是编译文件的问题,删除编译的文件就好了。
2012-1-30 17:53 Monday  

PclZip简介与使用

PclZip介绍
PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip、PKZIP);且能对此类类档案进行处理,包括产生压缩档、列出压缩档的内容以及解压缩档案等等。由于能够在伺服器端进行压缩与解压缩的动作,所以相当方便使用。
PclZip定义一个PclZip类别,其类别物件可视为一个ZIP档案,亦提供method来进行处理。

如何使用PclZip
1.基础
所有的功能都由pclzip.lib.php这个档案提供,PclZip library可于其首页(www.phpconcept.net/pclzip/index.en.php)下载。所有的PKZIP档案其实就是一个 PclZip的类别物件。当产生一个PclZip档案(ie, PclZip类别物件),就会先产生一个压缩档,且档名已经指定,但此压缩档的内容尚未存在:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip("archive.zip");
?>

此物件提供了一些public method可用来处理此档案。

2.参数
每一个method有其各自可使用的参数,包括有必须与非必须的参数:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');

$v_list = $archive->add('dev/file.txt',
PCLZIP_OPT_REMOVE_PATH, 'dev');
?>

上例中的’dev/file.txt’就是必须参数;’PCLZIP_OPT_REMOVE_PATH’则为非必须参数。当然有些method也可以只包含非必须的参数:

< ?PHP
$list = $archive->extract(PCLZIP_OPT_PATH, "folder",
PCLZIP_OPT_REMOVE_PATH, "data",
PCLZIP_CB_PRE_EXTRACT, "callback_pre_extract",);
?>

上例中原本压缩档内档案存放的路径为/data,不过你可以指定解压缩至/folder中。此外,在解压缩之前,会呼叫callback function(’callback_pre_extract()’),此function可让使用者在解压缩的过程中变更档案存放路径与档名,或是选 择某些档案不解压缩。
所有可用的非必要参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。

3.回传值
每个method所回传的值可能会不同,将会在每个method中说明。不过大部分的method回传0、error或是阵列。

4.错误处理
从版本1.3之后,错误处理已经整合至PclZip类别中,当一个method回传错误码,可以得知一些额外的讯息以方便错误处理:
* errorName():回传错误名称
* errorCode():回传错误码
* errorInfo():回传错误的描述

接下来会举几个例子来说明如何使用PclZip。

PclZip实例1、产生ZIP压缩档
PclZip($zipname):为PclZip constructor,$zipname为PKZIP压缩档的档名。
主要是产生一个PclZip物件,即一个PKZIP压缩档;但此时,只有压缩档产生出来,并做一些检查(例如是否有开启zlib extension…等),除此之外,并没有做其他动作。
create($filelist, [optional arguments list]):将参数$filelist指定的档案或目录(包含当中所有档案与子目录)加入上述所产生的压缩档中。
而非必要的参数则能够修改压缩档内的档案存放路径。
此method可用的参数可以参考网志(www.phpconcept.net/pclzip/man/en/index.php)。

下面的示例说明如何产生PKZIP压缩档(档名为archive.zip),并将file.txt、data/text.txt以及目录folder(包含当中的档案与子目录)加入刚刚产生的archive.zip中:

< ?PHP
include_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
$v_list = $archive->create('file.txt,data/text.txt,folder');
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

下面的示例说明基本上与上例一样产生archive.zip,但在将file.txt与text.txt压缩于其中时,将路径由data/改为 install/ ;因此,在archive.zip中这两个档案的路径会是install/file.txt与install/text.txt

< ?PHP
include_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
$v_list = $archive->create('data/file.txt,data/text.txt',
PCLZIP_OPT_REMOVE_PATH, 'data',
PCLZIP_OPT_ADD_PATH, 'install');
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

PclZip实例2、列出压缩档内容
listContent( ) :列出压缩档中的内容,包括档案的属性与目录:

< ?PHP
include_once('pclzip.lib.php');
$zip = new PclZip("test.zip");

if (($list = $zip->listContent()) == 0) {
die("Error : ".$zip->errorInfo(true));
}

for ($i=0; $i<sizeof ($list); $i++) {
for(reset($list[$i]); $key = key($list[$i]); next($list[$i])) {
echo "File $i / [$key] = ".$list[$i][$key]."<br>";
}
echo "<br />";
}
?></sizeof>

上例将会回传结果:
File 0 / [filename] = data/file1.txt
File 0 / [stored_filename] = data/file1.txt
File 0 / [size] = 53
File 0 / [compressed_size] = 36
File 0 / [mtime] = 1010440428
File 0 / [comment] =
File 0 / [folder] = 0
File 0 / [index] = 0
File 0 / [status] = ok

File 1 / [filename] = data/file2.txt
File 1 / [stored_filename] = data/file2.txt
File 1 / [size] = 54
File 1 / [compressed_size] = 53
File 1 / [mtime] = 1011197724
File 1 / [comment] =
File 1 / [folder] = 0
File 1 / [index] = 1
File 1 / [status] = ok

PclZip实例3、解压缩档案
extract([options list]) :解压缩PKZIP中的档案或目录。
[options list]可用的参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。这些参数能让使用者在解压 缩的时候有更多的选项,譬如指定变更解压缩档案的路径、指定只解压缩某些档案或不解压缩某些档案或者是将档案解压缩成字串输出(可用于readme档)。

下例是一个简单的解压缩档案示例,将压缩档archive.zip内的档案解压缩至目前的目录:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');


if ($archive->extract() == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

下例是进阶的解压缩档案使用,archive.zip中所有档案都解压缩于data/中,而特别指明在install/release中的所有档案也直接丢于data/中,而非data/install/ release:

< ?PHP
include('pclzip.lib.php');
$archive = new PclZip('archive.zip');
if ($archive->extract(PCLZIP_OPT_PATH, 'data',
PCLZIP_OPT_REMOVE_PATH, 'install/release') == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

相关文档:
PclZip官方地址:http://www.phpconcept.net/pclzip/index.php
PclZip手册地址:http://www.phpconcept.net/pclzip/man/en/index.php
PEAR类创建ZIP档案文件:http://www.ccvita.com/10.html
PclZip简介与使用:http://www.ccvita.com/59.html
PclZip:强大的PHP压缩与解压缩zip类:http://www.ccvita.com/330.html

2012-1-30 17:52 Monday  

PHP常用函数手册

PHP常用函数手册判断一个编程语言的功能强弱,可以从他的库函数入手。一个较好的编程语言,必然有较强的库函数。
I/O函数
Flush
函数描述:flush();
说明:函数Flush刷新PHP的输出缓存,它尽量将缓和存中的内容输出到用户的浏览器。
返回值:无
Print
函数描述:print(string arg,string[arg],…);
说明:函数print输入所有的参数。
返回值:若输出成功,返回true(1);否则返回false(0)。
Printf
函数描述:printf(string format,mixed[string]);
说明:函数printf根据所给格式format,输出string。格式以一个%开头,以一个字母结尾,该字母决定输出的数据类型。PHP的类型说明符如表所示。
PHP的类型说明符
类型说明符   说         明
b   输出二进制整数
o   输出八进制整数
x,X   输出十六进制整数,“x”使用小写字母,“X”使用大写字母
d   输出十进制整数
c   输出由整数ASCII代码说明的字符
s   输出字符串
f   输出浮点数
e   输出用科学计数法表示的浮点数
%   输出一个百分号
返回值:无
正规表达式函数
Ereg
函数描述:int ereg (string pattern ,string string ,array[regs]);
说明:函数ereg在参数string中寻找pattern中给出的正规表达式相匹配的项。如果提供了可选reg数组,则每一项匹配将顺序存储在数组 regs[1]开始的各项中。在regs[0]中存储整个正规表达式的匹配项。在函数ereg中,匹配的辨别是区分大小写的。请参看以下程序
返回值:若至少有一处匹配则函数ereg返回true(1);否则返回false(0)。
例子:
<?
$date=”2000-5-4”;
if (ereg(“([0-9]){4})-([0-9]{1,2}-([0-9]){1,2})”,$date,$regs))
{
print(“$regs[3].$regs[2].$regs[1]”);
}
else
{
print(“输出时间格式有误:$date”);
}
?>
该程序输出结果:14.5.2000
Ereg_replace
函数描述:string Ereg_replace(string pattern,string replacement,string string);
说明:函数Ereg_replace可用于替换文本,当参数pattern与参数string中的字串匹配时,他就被参数replacement的内容所 替换。若参数pattern中包含有圆括号的子表达式,则在参数replacement中可以用包含特定的代码来说明哪个子表达式被替换,最多可以有九个 子表达式。其具体形式是用两个反斜杠后跟一个从0~9的单数字,0表示与整个表达式相匹配,1~9表示相应的与前1~9个子表达式相匹配。注意,参数 pattern中的圆括号是可以嵌套的,其表达式序号等于该表达式前的圆括号的数目。
返回值:函数ereg_eplace返回替换后的字符串pattern。
Eregi
函数描述:int eregi(string pattern , string string , array[regs]);
说明:函数eregi与ereg相类似,不同之处是函数eregi进行匹配时不区分大小写。
返回值:若至少有一处相匹配,函数eregi返回true(1),否则返回false(0)。
Eregi_replace
函数描述:string Eregi_replace(string pattern,string replacement,string string);
说明:函数eregi_replace与ereg_replace相类似,不同之处就是函数eregi_replace进行匹配时不区分大小写。
返回值:函数eregi_eplace返回替换后的字符串pattern。
Split
函数描述:array split(string pattern,string string , int[limit]);
说明:函数split以参数pattern作为分界符从参数string 中取行一系列子串,并将它们存入一字符串数组。参数limit限定生成数组的大小,数组中的最后一个元素为参数string中还未分组的所有内容。
返回值:函数split返回生成的字符串数组,如果有一个错误,返回false(0)。
Sql_regcase
函数描述:string sql_regcase(string string);
说明:函数sql_regcase生成一个字符串数组,数组中的各个元素依次为参数string中各个字符的大小写;若在参数string中有一个空格,其对应数组元素的内容为一个空格。
返回值:函数sql_regcase返回所生成字符串数组。
例:
<?
print(sql_regcase(“Hello PHP”));
?>
此程序结果为:[Hh][Ee][Ll][Ll][Oo][ ][Pp][Hh][Pp]
数学函数
Abs
函数描述:mixed abs(mixed number);
返回值:函数abs返回参数number的绝对值。
Acos
函数描述:double acos(double number);
返回值:函数acos返回参数number的反余弦值。如果参数number大于1或小于1,则其反余弦值无意义。
Asin
函数描述;double asin(double number);
返回值:函数asin返回参数number的反正弦值。如果参数number大于1或小于1,则其反正弦值无意义。
Atan
函数描述:double atan(double number);
函数atan返回参数number的反正切值。
Atan2
函数描述:Double atan2(double x , double y);
返回值:函数atan2返回由直角坐标系指定的座标点在极座标系中的角度的弧度值。
BinDec
函数描述:int bindec(string binary_number);
返回值:函数bindec返回一个用二进制数写成的字符串binary_number的整数值。PHP使用32位带符号的整数,其二进制数的第一位是符号位。
Ceil
函数描述:int ceil(double number);
返回值:函数ceil返回大于参数number 的最小整数;若number为整数。,则返回其本身。
Cos
函数描述:double cos(double angle);
返回值:函数cos返回以弧度的大小为参数angle的角的余弦值。
DecBin
与bindec相反,将十进制转为二进制。
DecHex(<->HexDec)
返回十六进制值
DecOct(<->OctDec)
返回八进制值
Deg2rad(<->Rad2reg)
函数描述:double deg2red(double angle);
返回值:函数deg2red返回角度数angle相对应的弧度值。
Exp
函数描述:double exp(double power);
返回值:函数exp返回自然对数的power次幂。
Floor
函数描述:int floor(double number);
返回值:返回参数number的整数部分。
Getrandmax
函数描述:int getrandmax();
返回值;返回由函数rand所能返回的最大值
Log(Log10)
函数描述:Double log(double number);
返回值:返回参数number的自然对数(返回以10为底的对数)
Max (<->Min)
函数描述:mixed max(mixed arg1, mixed arg2, …,mixed argn);
返回值:返回此数组中的最大值(最小值),若参数中有浮点数,则所有参数转化成浮点数,返回值也为浮点数;否则所有参数转化成整数,返回值为整数。
pi
函数描述:double pi();
返回值:函数pi返回圆周率的近似值。
Pow
函数描述:double pow(double base,double power);
返回值:函数pow返回参数base的power次幂。
Rand
函数描述:int rand(int lowest,int longest);
说明:函数rand使用前要用srand激活。
返回值:函数rand返回可选参数lowest和longest之间的一个数(包含两个参数);若无参数,则返回值的范围从零到getrandmax返回的整数。
Round
函数描述:double round(double number);
返回值:函数round返回最接近参数number的整数。
Sin
函数描述:double sin(double angle);
返回值:函数sin返回一个用弧度表示的角的正弦值。
Sqrt
函数描述:double sqrt(double number);
说明:在函数sqrt中,参数number不能小于0。
返回值:函数sqrt返回参数number的平方根。
Srand
函数描述:srand(int seed);
说明:函数srand激活随机数发生器。参数seed是随机产生的种子,即所得的随机数是由参数经过一系列计算所的。
返回值:无。
Tan
函数描述:double tan(duoble angle);
返回值:函数tan返回以弧度表示的角的正切值。
时间函数
CheckDate
函数描述:int checkdate(int month,int date,int year);
说明:在PHP中谔谔所谓合法日期,指的是参数year介于1900~32767之间,month介于1~12之间,day处于当前月的有效日期之间的日期。
返回值:若输入的日期合法,返回true(1);否则返回false(0)。
Date
函数描述:string date(string format, int [timestamp]);
说明:函数date根据参数format生成一个描述日期timestamp的字符串。参数timestamp可选,若给定,则为所需的时间戳,即从1970年1月1日开始的秒数;若为空白,则使用当前日期。Format代码如下表:
返回值:函数date返回生成的日期描述字符串。
函数date的format代码表
代     码   描     述
a   am/pm
A   AM/PM
d   有前导零的月份中的日期
D   三字母简写形式的星期几
F   月份名
h   用1~12表示的小时
H   用0~23表示的小时
I   分钟
j   没有前导零的月份中的日期
l   星期几
m   用1~12表示的月份
M   简写月份名
S   月份中日期的正序后缀
U   从纪元开始的秒数
y   两位的年份
Y   四位的年份
Z   一年之中的日期
Getdate
函数描述:array getdate(int[timnestamp]);
说明:函数生成一个带有所给日期信息的关联数组。参数timestamp为所需的时间戳,若为空,则使用当前日期。关联数组元素如下表所示:
返回值:函数getdate返回生成的关联数组。
函数getdate生成的关联数组元素表
元     素   描     述
hours   24小时格式的小时
mday   月份中的日期
minutes   分钟
mon   数字形式的月份
month   月份的全称
seconds   秒数
wday   从0~6数字形式的星期几
weekday   星期几的名称
yday   一年中数字形式的日期
year   年份
0   日期戳
MkTime
函数描述:int mktime(int hour, int minute, int second, int month, int day, int year);
返回值:函数mktime返回给出日期的时间戳,即从1970年1月1日开始的秒数。所有参数都可选,若为空,则使用当前值。若某参数超过范围,函数mktime也可以正确解释。例如,用13作为月份就等于第二年的一月份。
GmmkTime
函数描述:int gmmktime(int hour, int minute, int second, int month, int day, int year);
返回值:函数gmmktime与函数mktime相类似,但不同的是他的各参数均被认为是格林威治时间。
Time
函数描述:int time();
返回值:函数time返回当前的时间戳。
MicroTime
函数描述:string microtime();
返回值:函数microtime返回一个字符串,其组成为两个由空格隔开的成员,第一个成员是系统时间的毫秒数,第二个成员是从1970年1月1日开始计的秒数,即系统时间的时间戳。
6.2.5字符串操作函数
AddSlashes
函数描述:string addslashes(string string);
说明:函数addslashes在参数string中的单引号(‘)、双引号(“)、反斜杠(\)和空格前添加反斜杠(\)。
返回值:函数addslashes返回添加后的字符串参数string。
Chop
函数描述:string chop(string string);
返回值:函数chop去除参数string中最后一个非空字符后的所有空格,并返回生成的新字符串。
Chr
函数描述:string chr(int ascii);
返回值:函数chr根据所给的ASCII码返回相对应的字符。
Eval
函数描述:eval(string phpcode);
说明:函数eval将参数phpcode作为PHP脚本中的一行代码执行,括号内应用单引号或退格美元符。
返回值:无。
Explode
函数描述:array explode(string separator,string string);
返回值:函数explode返回一个字符串数组,数组元素是由参数separator分隔的参数string的各段内容。
Htmlspecialchars
函数描述:string htmlspecialchars(string string);
说明:在HTML中,某些字符与特殊意义,为保留其原意,则将他们用HTLM语言描述。
‘&’转换为“&”
‘ ” ’转换为‘&qout’
‘<’转换为’ < ’
‘>’转换为‘>’
返回值:函数htmlspecialchars返回转变后的字符串。

Implode
函数描述:string implode(array pieces ,string glue);
返回值:将数组pieces依次用参数glue联结并返回生成的字符串
Jion
函数描述:string join(array pieces ,string glue);
说明:函数jion与函数implode作用完全相同。
Ltrim
函数描述:string ltrim(string string);
返回值:去除参数string中第一个非空字符前的所有空格,并返回生成的新字符串。
Nl2br
函数描述:string nl2br(string string);
返回值:在所有的新行前插入“<br>”,并生成新的字符串。
Ord
函数描述:int ord(string string);
返回值:返回所有字符的ASCII码。
QuoteMeta
函数描述:string quotemeta(string string);
返回值:此函数返回一个字符串,该字符串在参数string中的下列元素前加反斜杠:“.”“+”“\\”“*”“?”“[”“]”“^”“(”“)”“$”
RawurldeCode
函数描述:string rawurldecode(string string);
返回值:将原参数字符串string中的百分号(%)及其后的两位十六进制数替换成对应的文本字符,并返回替换后的字符串。
Sprintf
函数描述:string sprintf(string format,mixed[string]);
返回值:与函数printf作用类似,不同之处是他不将原需输出的字符串发送给浏览器,而是返回该字符串。
Strchr
函数描述:string strchr(string string ,string needle);
说明:与函数strstr的作用相同。
Strcmp
函数描述:int strcmp(string str1,string str2);
说明:函数strcmp比较参数Str1与str2的大小,比较过程区分大小写。
返回值:如果str1大于str2,则函数strcmp返回1;如果str1小于str2,则返回-1;如果两者相等,则返回0。
Strcspn
函数描述:int strcspn(string str1 ,string str2);
返回值:从参数str1的首字符开始,不包括参数str 2中任意一个字符的最短字符串的长度。
(即str2在str1中的位置,返回的位置从0开始。)
StripSlashes
函数描述:string stripslashes(string string);
说明:删除参数string中的反斜杠字符。
返回值:返回经过上述操作的字符串。
Strlen
函数描述:int strlen(string string);
返回值:返回参数字符串string的长度。
Strpos
函数描述:int strops(string string ,string needle);
说明:函数strpos中参数needle以整个字符串起作用。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strpos返回参数needle在字符串参数string中的最先位置,位置数从0开始。若在字符串string中不包含needle,则返回false(0)。
Strrpos
函数描述:int strrpos(string string ,string needle);
说明:与函数strpos不同,函数strrpos中,参数needle中起作用的只是其首字符。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strrpos返回参数needle在字符串参数string中的最后位置,位置数从0开始。若在字符串string中不包含needle,则返回false(0)。
Strrchr
函数描述:string strrchr(string string ,string needle);
说明:在函数strrchr中,参数needle中起作用的只是其首字符。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strrchr返回string中由最后一个needle字符开始及其之后的所有部分。若在字符串string中不包含needle,则返回false(0)。
Strrev
函数描述:string strrev(string string);
返回值:函数strrev将参数string倒置并返回。
StrStr
函数描述:string strstr(string string ,string needle);
说明:若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strstr返回参数string中从参数needle开始及其之后的部分,包括参数needle。
Strtok
函数描述:string strtok(string str1,string str2);
返回值:返回参数str1中在参数str2首字母前的字符串。
Strtolower(<-> Strtoupper)
函数描述:string strtolower(string string);
说明:jiang参数string中的大写字母替换成小写字母。
返回值:替换后的字符串。
Strtr
函数描述:string strtr(string string ,string from ,string to);
说明:函数strtr将参数string中字符from替换成字符to,若参数from和参数to的长度不同,则较长字符串中超过较短字符串长度的部分将被丢弃。
返回值:返回替换后的字符串。
Substr
函数描述:string substr(string string,int start,int [length]);
说明:函数substr从参数string中的第start个字符开始,提取出一个长度为length的字符串。如果参数start是正数,则返回字符串 将从参数string首部起第start个字符开始;若为负数,则返回字符串将从参数string尾部逆推的第start个字符开始。如果参数给出并为 正,,则返回的是一个从start开始的长度为length的字符串;如果参数length给出且为负,则返回的字符串以正数第start位字符为首,以 从参数string尾部开始逆推(-length)个字符为结束的字符串;若返回的字符串长度为负,则返回值为NULL。
返回值:返回所提取出的字符串。

2012-1-30 17:48 Monday  

JSON基 于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

PHPserialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。

先从JSON说起,看一个简单的实例

例一:

  1. var test = {"Name":"Peter","Age":20};
  2. document.write(test.Name + ": " + test.Age);

显示结果:

Peter: 20

变量test中{"Name":"Peter","Age":20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。

当然也可以变得复杂些。

例二:

  1. var test = {"User":{"Name":"Peter","Age":20},"Company":"FORD"};
  2. document.write(test.User.Name + ": " + test.Company);

显示结果:

Peter: FORD这个例子中User元素中包含了Name和Age。

如果要体现多个User,则需要使用数组,区别于对象的"{}",数组使用"[]"。

JSON解析例三:

  1. var test = [
  2.                   {"User":{"Name":"Peter","Age":20},"Company":"FORD"},
  3.                   {"User":{"Name":"Li Ming","Age":20},"Company":"Benz"}
  4.                ];
  5. document.write(test[1].User.Name + ": " + test[1].Company);
  6. //或者使用:document.write(test[1]["User"]["Name"] + ": " + test[1]["Company"]);

JSON解析显示结果:

Li Ming: Benz

通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。

JSON解析例四:

  1. $arr = array
  2.         (
  3.            'Peter'=> array
  4.            (
  5.              'Country'=>'USA',
  6.              'Age'=>20
  7.            ),
  8.            'Li Ming'=> array
  9.            (
  10.               'Country'=>'CHINA',
  11.               'Age'=>21
  12.            )
  13.          );
  14. $serializeserialize_var = serialize($arr);
  15. echo $serialize_var;

JSON解析显示结果:

  1. a:2:{s:5:"Peter";a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}s:7:"Li Ming";a:2:{s:7:"Country";s:5:"CHINA";s:3:"Age";i:21;}}

这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}为例:

a:2说明这是个有两个元素的数组(array),s:7:"Country";s:3:"USA";为第一个元素,s:7说明这是有7个字符的字符串(string),后面i:20;也应该猜得到是整数(integer)20。

再来看一下这个例子,

例五:

  1. class test
  2. {
  3.     var $var = 0;
  4.     function add(){
  5.       echo $var+10;
  6.      }
  7. }
  8. $unserialize_var = new test;
  9. $serialize_var = serialize($unserialize_var);
  10. echo $serialize_var;
  11. $unserialize_var = null;
  12. $unserialize_var = unserialize($serialize_var);
  13. $unserialize_var->add();

显示结果:

O:4:"test":1:{s:3:"var";i:0;}

10

从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法

那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。

例六:

  1. $arr = array
  2.         (
  3.           'Name'=>'Peter',
  4.           'Age'=>20
  5.         );
  6. $jsonencode = json_encode($arr);
  7. echo $jsonencode;


显示结果:

{"Name":"Peter","Age":20}

这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。

例七:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var);
  3. print_r($jsondecode);

显示结果:

  1. stdClass Object ( [Name] => Peter [Age] => 20 )

这的确验证了,在JSON中{"Name":"Peter","Age":20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var,true);
  3. print_r($jsondecode);

显示结果:

  1. Array ( [Name] => Peter [Age] => 20 )

另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。通过上面这些例子相信大家对于JSON和 PHP的serialize、json_encode都有了初步了解,结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互 功能。

MYSQL的事务处理主要有两种方法:

1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认

2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

常用的是第一种方法!

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:
1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。

I. Mysql扩展库API用法
/*方法一*/
Php代码 复制代码
  1. $link = mysql_connect('localhost', 'root', '');   
  2. if (!$link) {   
  3.     die('Could not connect: ' . mysql_error());   
  4. }   
  5. mysql_select_db('test', $link) or die ('Can\'t use [test]: ' . mysql_error());   
  6. mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");   
  7. //若不使用事務,則$sql執行成功,$sql1執行失敗     
  8. $sql = " insert into test values('11','88') ";   
  9. $sql1 = " insert into test values('11','88','444') ";   
  10. $res = mysql_query($sql);   
  11. $res1 = mysql_query($sql1);     
  12. //因爲使用了事務,則兩個insert都執行失敗   
  13. if($res && $res1){   
  14.      mysql_query("COMMIT");   
  15. } else{   
  16.      mysql_query("ROLLBACK");   
  17. }   
  18. mysql_close($link);  


/*方法二*/
Php代码 复制代码
  1. // connect db....   
  2. mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交   
  3. $sql = " insert into test values('11','88') ";   
  4. $sql1 = " insert into test values('11','88','444') ";   
  5. $res = mysql_query($sql);   
  6. $res1 = mysql_query($sql1);     
  7. //因爲使用了事務,則兩個insert都執行失敗   
  8. if($res && $res1){   
  9.          mysql_query("COMMIT");   
  10. }else{   
  11.          mysql_query("ROLLBACK");   
  12. }   
  13. // close db...  


/*方法三*/
Php代码 复制代码
  1. //对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:   
  2. //MyISAM & InnoDB 都支持,   
  3. //Notes:query語句不能寫在一起如:mysql_query("select * from a;select * from b;");   
  4. $sql_1=" LOCK TABLES test WRITE ";   
  5. mysql_query($sql_1);   
  6.   
  7. $sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";   
  8. if(mysql_query($sql_2)){   
  9.   echo 'successful!';   
  10. }else{   
  11.   echo 'Unsuccessful!';   
  12. }   
  13. $sql_3=" UNLOCK TABLES ";   
  14. mysql_query($sql_3);   


II. mysqli和pdo的用法
两个库都提供了commit/rollback函数封装,伪代码如下:
Php代码 复制代码
  1. if(conn.commit()){   
  2.    conn.rollback();   

2012-1-30 17:45 Monday  
/**
* 得到文件目录的大小/此数据只是大小数据,而不是所占用的空间
*/
function dirsize($dirname)
{
if(stripos(PHP_OS, "win")!==false){//For Windows
   $obj = new COM ( 'scripting.filesystemobject' );
   if ( is_object ( $obj ))
   {
    $ref = $obj->getfolder ( $dirname );
    $size = $ref->size;
    $obj = null;
    return $size;
   }
   else{
    return false;
   }
}else{// For Linux-like
   $io = popen ( '/usr/bin/du -sk ' . $dirname, 'r' );
   $size = fgets ( $io, 4096);
   $size = substr ( $size, 0, strpos ( $size, ' ' ) );
   pclose ( $io );
   return $size;
}
}


echo dirsize("E:")/(1024*1024);

2012-1-30 17:40 Monday  

用smarty插件,

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
/*这个会将绝对路径也修正,不对
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5",$tpl_source);
    */
    /*这个会将js也修正
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */

    /*这个不修正js */
    return preg_replace("/(<(img.*?src|link.*?href)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
}

文件取名prefilter.chpath.php,放到plugins,用 $smarty->load_filter('pre','chpath');就行了

最新修改此函数如下:

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
/*
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5",$tpl_source);
    */
    /*
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */
    /*
    return preg_replace("/(<(img.*?src|link.{1,100}href)=([\"']))(([^(http:\/\/|\{\$imgurl\})])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */
    return preg_replace("/(<(img.*?src|link.{1,100}href)=([\"']))(images|style)(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5$6",$tpl_source);
}

2012-1-30 17:39 Monday  

首先,向写这篇文章的GG 或MM表示感谢!

如果你不断地建立不同的函数来检查或者操作字符串的一部分,现在你可能要放弃所有的这些函数,取而代之的用正则表达式。如果你对下列的问题都答“是的”,那么你肯定要考虑使用正则表达式了:

补充开始----------------------------

配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{ 4,15 }$
匹配国内电话号码:(\d{ 3 }-|\d{ 4 }-)?(\d{ 8 }|\d{ 7 })?
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$


下表是元字符及其在正则表达式上下文中的行为的一个完整列表:

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。

$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。

* 匹配前面的子表达式零次或多次。

+ 匹配前面的子表达式一次或多次。+ 等价于 { 1, }。

? 匹配前面的子表达式零次或一次。? 等价于 { 0,1 }。

{ n } n 是一个非负整数,匹配确定的n 次。

{ n, } n 是一个非负整数,至少匹配n 次。

{ n,m } m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, { n }, { n, }, { n,m }) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

. 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。
(pattern) 匹配pattern 并获取这一匹配。

(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

(?!pattern) 负向预查,与(?=pattern)作用相反

x|y 匹配 x 或 y。

[xyz] 字符集合。

[^xyz] 负值字符集合。

[a-z] 字符范围,匹配指定范围内的任意字符。

[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。

\B 匹配非单词边界。

\cx 匹配由x指明的控制字符。

\d 匹配一个数字字符。等价于 [0-9]。

\D 匹配一个非数字字符。等价于 [^0-9]。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。

\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。

\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。

\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

------------------------------补充结束

你是否正在写一些定制的函数来检查表单数据(比如在电子信箱地址中的一个@,一个点)
你是否写一些定制的函数,在一个字符串中循环每个字符,如果这个字符匹配了一个特定特征(比如它是大写的,或者它是一个空格),那么就替换它?
除了是令人不舒服的字符串检查和操作方法,如果没有有效率地写代码,上述的两条也会使你的程序慢下来。你是否更倾向于用下面的代码检查一个电子信箱地址呢:

<?php
function validateEmail($email)
{
$hasAtSymbol = strpos($email, "@");
$hasDot = strpos($email, ".");
if($hasAtSymbol && $hasDot)
return true;
else
return false;
}
echo validateEmail("mitchell@devarticles.com");
?>
... 或者使用下面的代码:

<?php
function validateEmail($email)
{
return ereg("^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$", $email);
}
echo validateEmail(mitchell@devarticles.com);
?>

可以肯定的是,第一个函数比较容易,而且看起来结构也不错。但是如果我们用上面的下一个版本的email地址检查函数不是更容易吗?

上面展示的第二个函数只用了正则表达式,包括了对ereg函数的一个调用。Ereg 函数返回true或者false,来声明它的字符串参数是否和正则表达式相匹配。

很多编程者避开正则表达式,只因为它们(在一些情况下)比其它的文本处理方法更慢。正则表达式可能慢的原因是因为它 们涉及把字符串在内存中拷贝和粘贴,因为正则表达式的每一个新的部分都对应匹配一个字符串。但是,从我对正则表达式的经验来说,除非你在文本中几百个行运 行一个复杂的正则表达式,否则性能上的缺陷都可以忽略不计,当把正则表达式作为输入数据检查工具时,也很少出现这种情况。


正则表达式语法
在你可以匹配一个字符串到正则表达式之前,你必须先建立正则表达式。开始的时候,正则表达式的语法有点古怪,表达式中的每一个短语代表某个类型的搜索特征。下列是一些最普通的正则表达式,也都对应着一个如何使用它的例子:

字符串头部
搜索一个字符串的头部,用^,例如

<?php echo ereg("^hello", "hello world!"); ?>
将返回 true, 但是
<?php echo ereg("^hello", "i say hello world"); ?>
将返回 false, 因为hello不在字符串”I say hello world”的头部。
字符串尾部

搜索字符串尾部,用$,例如:
<?php echo ereg("bye$", "goodbye"); ?>
将返回true, 但是
<?php echo ereg("bye$", "goodbye my friend"); ?>
将返回 false,因为bye不在字符串”goodbye my friend”的尾部.

任意的单个字符
搜索任意字符,用点(.),例如:
<?php echo ereg(".", "cat"); ?>
将返回true,但是
<?php echo ereg(".", ""); ?>
将返回false,因为我们的要搜索字符串没有包含字符。你可以用花括号随意告诉正则表达式引擎它要匹配多少个单个字符。如果我只想匹配5个字符,我可以这样用ereg:
<?php echo ereg(".{ 5 }$", "12345"); ?>
上面的这段代码告诉正则表达式引擎当且仅当至少5个连续的字符出现字符串的尾部时返回true.我们也可以限制连续出现的字符的数目:
<?php echo ereg("a{ 1,3 }$", "aaa"); ?>
在上面的例子里,我们已经告诉正则表达式引擎,我们的搜索字符串来匹配表达式,它在尾部必须有介于1和3个的”a”字符。
<?php echo ereg("a{ 1,3 }$", "aaab"); ?>
上面的例子将不会返回true,虽然有三个”a”字符在搜索字符串里,但是它们不是在字符串的尾部。如果我们把结尾字符串匹配$从正则表达式中去掉,那么这个字符串是匹配的。
我们也可以告诉正则表达式引擎来匹配至少有确定数目的字符在一行,如果它们存在的,可以匹配更多。 我们可以这样做:
<?php echo ereg("a{ 3, }$", "aaaa"); ?>

零或多次重复字符
为了告诉正则表达式引擎一个字符可能存在,也可以重复,我们用*字符。这里的两个例子都将返回true.

<?php echo ereg("t*", "tom"); ?>
<?php echo ereg("t*", "fom"); ?>
即使第二个例子不包含”t”这个字符,但仍旧返回ture,因为*表示字符可以出现,但不是必须出现。事实上,任何普通的字符串模式都会使上面的ereg调用返回true,因为’t’字符是可选的.


一或多次重复字符
为了告诉正则表达式引擎一个字符必须存在,也可以重复不止一次,我们用+字符,像

<?php echo ereg("z+", "i like the zoo"); ?>
下面的例子也会返回true:
<?php echo ereg("z+", "i like the zzzzzzoo!"); ?>

零或一次重复字符
我们也可以告诉正则表达式引擎,一个字符必须是或者只存在一次,或者没有。我们用?字符来做这项工作,就像
<?php echo ereg("c?", "cats are fuzzy"); ?>
如果我们愿意,我们完全可以从上面的搜索字符串中删除’c’,这个表达式会仍旧返回true.’?’ 的意思是一个’c’可以出现在搜索字符串的任何地方,但不是必须的。


正则表达式语法 (续)
空格字符
为了匹配一个搜索字符串中的空格字符,我们用预定义Posix的类,[[:space]].方括号标明连续字符的相关性,”:space:”是实际要匹配 的类(在这种情形下,是任何空白字符)。空白包括tab字符,新行字符,空白字符。或者,如果搜索字符串必须包含只有一个空格,而不是一个tab或者新行 字符,你可以用一个空格字符(" ")。在大多数情况下,我倾向于使用":space:",因为这意味着我的意图不仅仅是单个空格字符,这点很容易被忽视。这里有一些Posix-标准预定 义类,
有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类,包括[:alnum:], [:digit:], [:lower:]等等。 完整的列表可以在这里查看

我们可以像这样匹配单个空白字符:

<?php echo ereg("Mitchell[[:space:]]Harper", "Mitchell Harper"); ?>
我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。
<?php echo ereg("Mitchell[[:space:]]?Harper", "MitchellHarper"); ?>

模式分组
相关的模式可以在方括号里分在一起。很容易用[a-z]和[A-Z]指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。
<?php
// 要求从第一个到最后一个都是小写字母
echo ereg("^[a-z]+$", "johndoe"); // 返回true
?>
或者像
<?php
// 要求从第一个到最后一个都是大写字母
ereg("^[A-Z]+$", "JOHNDOE"); // 返回 true?
?>
我们也可以告诉正则表达式引擎,我们希望或者是小写字母,或者是大写字母。我们只要把[a-z]和[A-Z]模式结合在一起就可以做到。
<?php echo ereg("^[a-zA-Z]+$", "JohnDoe"); ?>
在上面的例子里,如果我们能匹配"John Doe",而不是"JohnDoe",将是非常有意义的。我们用下面的正则表达式来做这个:
^[a-zA-Z]+[[:space:]]{ 1 }[a-zA-Z]+$
很容易搜索一个数字字符串
<?php echo ereg("^[0-9]+$", "12345"); ?>

词语分组
不仅仅搜索模式可以分组,我们也可以用圆括号把相关的搜索词语进行分组。
<?php echo ereg("^(John|Jane).+$", "John Doe"); ?>
在上面的例子中,我们有一个字符串头部字符,紧跟着"John"或者"Jane",至少有一个其它字符,然后一个字符串尾部字符。所以…
<?php echo ereg("^(John|Jane).+$", "Jane Doe"); ?>
...将也匹配我们的搜索模式

特殊字符的情形
因为一些字符要用在一个搜索模式的明确分组或者语法上,像在(John|Jane)中的圆括号,我们需要告诉正则表达式引擎来屏蔽这些字符,加工它们使之 成为被搜索字符串的一部分,而不是搜索表达式的一部分。我们所用的方法称为“字符转义”,涉及到将任何“专用符号”加上反斜杠。所以,例如,如果我想在我 的搜索中包含’|’,那么我就可以这样做
<?php echo ereg("^[a-zA-z]+\|[a-zA-z]+$", "John|Jane"); ?>
这里只是少量的一些你要转义的字符,你必须转义^, $, (, ), ., [, |, *, ?, +, \ and { 。
希望你现在对正则表达式实际上有多么强大有了一点点感觉了。现在让我们看两个用正则表达式来检查数据中一个字符串的例子。


正则表达式例子
例子1
让我们把第一个例子做的相当简单,检验一个标准的URL.一个标准的URL(没有端口号),有三个部分构成:

[协议]://[域名]

让我们从匹配URL的协议部分开始,并且让它只能用http或者ftp.我们可以用下面的正则表达式做到这点:

^(http|ftp)
^字符特指字符串的头部,利用圆括号把http和ftp围住,且用“或者”符号(|)将它们分开,我们告诉正则表达式引擎http和ftp两者之一必须在字符串的开头。

一个域名通常由www.somesite.com构成,但是可以随意选择要不要www部分。为了例子简单,我们只允许.com,.net,和.org的域名是在考虑之中的。我们最好这样对正则表达式中的域名部分表示如下:
(www\.)?.+\.(com|net|org)$
把所有的东西放在一起,我们的正则表达式就可以用作检查一个域名,如:

<?php
function isValidDomain($domainName)
{

return ereg("^(http|ftp)://(www\.)?.+\.(com|net|org)$", $domainName);
}
//真(true)
echo isValidDomain("http://www.somesite.com");
//真(true)
echo isValidDomain("ftp://somesite.com");
//假 (false)
echo isValidDomain("ftp://www.somesite.fr");
//假 (false)
echo isValidDomain(www.somesite.com);
?>

例子二
因为我居住在澳大利亚悉尼,让我们检查一个典型的澳大利亚国际电话号码。澳大利亚国际电话号码的格式如下:
+61x xxxx-xxxx
第一个x是区号,其它的都是电话号码。检查以'+61'开头且紧跟一个在2到9之间的区号的电话号码,我们用下面的正则表达式:

^\+61[2-9][[:space:]]
注意,上面的搜索模式把'+'字符用''转义,以便于可以在搜索中包含,不至于被解释为一个正则表达式。[2-9]告诉正则表达式引擎我们需要包含一个2到9之间的数字。[[:space:]]类则告诉正则表达式期望在这里有一个空白。

这里是电话号码剩下的搜索模式:
[0-9]{ 4 }-[0-9]{ 4 }$
这里没有什么不寻常的地方,我们只是告诉正则表达式引擎电话号码可用的数字,它必须是4个数字的组合,跟着一个连接符,再跟着另一个4个数字的组合,然后一个字符串尾部字符。
把完整的正则表达式放在一起,放进一个函数,我们可以用代码来检查一些澳大利亚国际电话号码:
<?php
function isValidPhone($phoneNum)
{
echo ereg("^\+61[2-9][[:space:]][0-9]{ 4 }-[0-9]{ 4 }$", $phoneNum);
}
// 真(true)
echo isValidPhone("+619 0000-0000");
// 假(false)
echo isValidPhone("+61 00000000");
//假( false)
echo isValidPhone("+611 00000000");
?>

2012-1-30 17:38 Monday  
<form id="form1" name="form1" method="post" action="">
   <input type="text" name="start" />
  到
  <input type="text" name="end" />
   <input type="submit" name="Submit" value="提交" />
   <input type="reset" name="Submit2" value="重置" />
</form>

<?php /* *心若水寒 *http://www.phpfans.net/ */ if(isset($_POST['Submit'])){ $conn = mysql_connect("localhost","root",""); mysql_query("set names 'gbk'"); mysql_select_db("caiji2"); for($i=$_POST['start'];$i<=$_POST['end'];$i++){ $url = "http://www.phper.com/html/php-mysql/".$i.".html"; @$fp = fopen($url,'r'); if(!$fp) continue; $buffer = ''; while(@!feof($fp)){ $buffer .= @fread($fp,1024); } preg_match_all("/<h1>(.+?)</h1>/is",$buffer,$title); $title[0][0] = preg_replace("/<h1>(.+?)</h1>/is","1",$title[0][0]); $title = explode("——",$title[0][0]); $ar_subject = $title[0]; //echo $ar_subject;exit; preg_match_all("/<div class="content">(.+?)</div>/s",$buffer,$array); //echo $array[0][0];exit; //preg_match_all("/(.+)<br>/is",$array[0][0],$array); //$array[0][0] = str_replace("&lt;","<",$array[0][0]);CnPhper.com By Cnphper CnPhperFrom CnPhper.com //$array[0][0] = str_replace("&gt;",">",$array[0][0]); //$array[0][0] = htmlspecialchars($array[0][0]); //$array[0][0] = str_replace("<BR>","n",$array[0][0]); //$array[0][0] = str_replace("&nbsp;"," ",$array[0][0]); $ar_content = strip_tags($array[0][0],"<br>"); //$ar_content = str_replace("From CnPhper.com","",$ar_content); //$ar_content = preg_replace("/CnPhper.com/i","",$ar_content); //echo $ar_content;exit; //$ar_content = substr($array[0][0],14,-6); $sql = "insert into cdb_article values(null,'未知','".addslashes($ar_subject)."','".addslashes($ar_content)."','互联网','2006-07-20',0,4,0,1,0)"; mysql_query($sql,$conn); fclose($fp); } } ?>