精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>荷音 PHP 库>>HEYIN PHP 扩展库 3.00 - 模版分析扩展库

主题:HEYIN PHP 扩展库 3.00 - 模版分析扩展库
发信人: bb_rain(小雨)
整理人: tang(2001-01-31 09:00:38), 站内信件
<?

/******************************************************************************

Template Module for PHP3 & PHP4 ( v 3.00 )

Copyright (C) 2000 heyin.com, All Rights Reserved.
http://www.heyin.com
RAIN ( Email: [email protected] Oicq: 1235686 )

lib_template.php, 2001/01/01

*******************************************************************************/


class CTemplate {
var $path;
var $filename;

var $s;

var $cmode;
var $pmode;

var $blockpatterns = array();
var $patterns = array();
var $cpatterns = array();
var $ppatterns = array();

function CTemplate($Path, $Filename, $CMode=0, $PMode=0) {
$this->path = $Path;
    $this->filename = $Filename;

    $s = implode('', file($Path.$Filename));
    $this->s = preg_replace("/[\s|\=|\"|\']+(\w*\/)/", "{ DOC_PATH }\\1", $s);

    $this->cmode = $CMode;
    $this->pmode = $PMode;

    $blockpatterns[0] = array( "/<!--\s+CB\s+(\w*)\s*([^\|]*)\|*([^>]*)\s+-->(.*)<!--\s+CE\s+\\1\s+-->/sm",
                               "/<!--\s+CB\s+\$h\s*\$k\|*\$c\s+-->(.*)<!--\s+CE\s+\$h\s+-->/sm" );
    $blockpatterns[1] = array( "/<!--\s+RB\s+(\w*)\s*([^\|]*)\|*([^>]*)\s+-->(.*)<!--\s+RE\s+\\1\s+-->/sm",
                               "/<!--\s+RB\s+\$h\s*\$k\|*\$c\s+-->(.*)<!--\s+RE\s+\$h\s+-->/sm" );
    $blockpatterns[2] = array( "/<!--\s+MB\s+(\w*)\s*\|*([^>]*)\s+-->(.*)<!--\s+ME\s+\\1\s+-->/sm",
                               "/<!--\s+MB\s+\$h\s*\|*\$c\s+-->(.*)<!--\s+ME\s+\$h\s+-->/sm" );

    $patterns[0]  = array( "/\{\s+(\w+)\s+\}/", "/\{\s+\$k\s+\}/" );
    $patterns[1]  = array( "/\{\s+(\w*\.*\w+)\.(\w+)\s+\}/", "/\{\s+\$k\.\$v\s+\}/" );
    $patterns[2]  = array( "/\{\s+(\w+)\(([^\)]*)\)\s+\}/", "/\{\s+\$k\(\$v\)\s+\}/" );
    $patterns[3]  = array( "/\{\s+(\w+)\[([^\]]*)\]\s+\}/", "/\{\s+\$k\[\$v\]\s+\}/" );
    $patterns[4]  = array( "/\{\s+GT\s+(\w+)\|*([^\}]+)\s+\}/", "/\{\s+GT\s+\$k\|*\$v\s+\}/" );
    $patterns[5]  = array( "/\{\s+GC\s+(\w+\,*\w*)\|*([^\}]*)\s+\}/", "/\{\s+GC\s+\$k\|*\$v\s+\}/" );
    $patterns[6]  = array( "/\{\s+GR\s+(\w+\,*\w*)\|*([^\}]*)\s+\}/", "/\{\s+GR\s+\$k\|*\$v\s+\}/" );
    $patterns[7]  = array( "/\{\s+ST\s+(\w+\,*\w*\,*\w*)\|*([^\}]*)\s+\}/", "/\{\s+ST\s+\$k\|*\$v\s+\}/" );
    $patterns[8]  = array( "/\{\s+SN\s+(\w+\,*\w*\,*\w*)\|*([^\}]*)\s+\}/", "/\{\s+SN\s+\$k\|*\$v\s+\}/" );
    $patterns[9]  = array( "/\{\s+JS\s+(\w*)\s+\}/", "/\{\s+JS\s+\$k\s+\}/" );
    $patterns[10] = array( "/\{\s+AD\s+(\w*)\s+\}/", "/\{\s+AD\s+\$k\s+\}/" );
    $patterns[11] = array( "/\{\s+COPYRIGHT\s+(\w*)\s+\}/", "/\{\s+COPYRIGHT\s+\$k\s+\}/" );

    $cpatterns[0] = array("/\[list\]([^\[]*)\[\/list\]/", "/<UL TYPE=square>\\1<\/UL>/");
    $cpatterns[1] = array("/\[list=(\w+)\]([^\[]*)\[\/list\]/", "/<OL TYPE=\\1>\\2<\/OL>/");
    $cpatterns[2] = array("/\[\*\]/", "/
  • /");
        $cpatterns[3] = array("/\[code\]([^\[]*)\[\/code\]/", "/<BLOCKQUOTE>\n<PRE>\n\\1<\/PRE>\n</BLOCKQUOTE>/");
        $cpatterns[4] = array( "/\[url\]www.([^\[]*)\[/url\]/","/<A HREF=\"http:\/\/www.\\1\" target=\"_blank\">\\1/");
        $cpatterns[5] = array( "/\[url\]http:\/\/([^\[]*)\[/url\]/","/<A HREF=\"\\1\" target=\"_blank\">\\1/");
        $cpatterns[6] = array( "/\[url\]([^\[]*)\[/url\]/","/<A HREF=\"http://\\1\" target=\"_blank\">http:\/\/\\1/");
        $cpatterns[7] = array("/\[url=\"([^\[]*)\"\]([^\[]*)\[/url\]/","<A HREF=\"\\1\" target=_blank>\\2");
        $cpatterns[8] = array("/\[url=([^\[]*)\]([^\[]*)\[/url\]/","<A HREF=\"\\1\" target=_blank>\\2");
        $cpatterns[9] = array("/\[email\]([^\[]*)\[/email\]/","<A HREF=\"mailto:\\1\">\\1");

        $ppatterns[0] = array("/\[img\]([^\[]*)\[/img\]/","<IMG SRC=\"\\1\" border=\"0\">");
      }

      function Parse() {
        if ($this->cmode==1) $this->s = $this->ParseCode($this->s, $this->cpatterns);
        if ($this->pmode==1) $this->s = $this->ParseCode($this->s, $this->ppatterns);
        $this->s = $this->ParseCBlock($this->s);
        $this->s = $this->ParseRBlock($this->s);
        $this->s = $this->ParseFlag($this->s);
        $this->s = $this->ParseMBlock($this->s);
        print $this->s;
      }

      function ParseCode($S, $P) {
        $count = sizeof($P);
        for ($i=0; $i<$count; $i++) {
    preg_replace($P[$i][0], $P[$i][1], $S);
    }
    return $S;
    }

    function ParseFlag($S, $No=0, $Color='') {
    $count = sizeof($this->patterns);
        for ($i=0; $i<$count; $i++) {
    $size = preg_match_all($this->patterns[$i][0], $S, $OUT);
          for ($j=0; $j<$size; $j++) {
    $k = $OUT[1][$j];
    $v = $OUT[2][$j];
    if (!empty($k)) {
    eval("\$patterns =\"".$this->patterns[$i][1]."\";");
              switch ($i) {
                case 0:
                  switch ($k) {
                    case "DOC_PATH":
                      $OutText = $vhis->path;
                      break;
                    case "COLOR":
                      $OutText = $Color[$No%2];
                      break;
                    case "I":
                      $OutText = $No;
                      break;
                    default:
                      $OutText = $GLOBALS[$k];
                      break;
                  }
                  break;
                case 1:
                  $p = explode('.', $k);
                  $count = sizeof($p);
                  $ds = ($count>1) ? $p[0] : 'DS';
                  $as = ($count>1) ? $p[1] : $k;
                  eval("\$OutText = \$GLOBALS['".$ds."']->DATA[".$as."][".$No."]['".$v."'];");
                  break;
                case 2:
                  eval("\$OutText = ".$k."(".$v.");");
                  break;
                case 3:
                  $v = empty($v) ? 0 : str_replace(',', '][', $v);
                  eval("\$OutText = \$GLOBALS[".$k."][".$v."];");
                  break;
                case 4:
                  $p = explode(',', trim($v));
                  $h = new CHtml($GLOBALS[$k], $p);
                  $OutText = $h->GroupText();
                  break;
                case 5:
                  $r = explode(',', $k);
                  $h = new CHtml($GLOBALS[$r[0]], trim($r[1]), $GLOBALS[$r[2]], trim($v));
                  $OutText = $h->GroupCheck();
                  break;
                case 6:
                  $r = explode(',', $k);
                  $h = new CHtml($GLOBALS[$r[0]], trim($r[1]), $GLOBALS[$r[2]], trim($v));
                  $OutText = $h->GroupRadio();
                  break;
                case 7:
                  $r = explode(',', $k);
                  $s = explode(',', $v);
                  $h = new CHtml($GLOBALS[$r[0]], trim($r[1]), $GLOBALS[$r[2]], trim($s[0]), $GLOBALS[$s[1]]);
                  $OutText = $h->SelectText();
                  break;
                case 8:
                  $r = explode(',', $k);
                  $s = explode(',', $v);
                  $h = new CHtml($GLOBALS[$r[0]], trim($r[1]), $GLOBALS[$r[2]], trim($s[0]), $GLOBALS[$s[1]]);
                  $OutText = $h->SelectNum();
                  break;
                case 9:
                  eval("\$OutText = \$GLOBALS[\'JS".$k."\'];");
                  break;
                case 10:
                  eval("\$OutText = \$GLOBALS[\'AD".$k."\'];");
                  break;
                case 11:
                  eval("\$OutText = \$GLOBALS[\'COPYRIGHT".$k."\'];");
                  break;
              }
              $S=preg_replace($patterns, $OutText, $S);
            }
          }
        }
        return $S;
      }

      function ParseCBlock($S) {
        $count = preg_match_all($this->blockpatterns[1][0], $S, $OUT);
        for ($i=0; $i<$count; $i++) {
    $h = $OUT[1][$i];
    $k = $OUT[2][$i];
    $c = $OUT[3][$i];
    $v = $OUT[4][$i];
    if (!empty($v)) {
    $OutText = "";
    if (!empty($c)) {
    $c = $this->ParseFlag($c);
              eval("\$result =".$c.";");
            } else $result = TRUE;
            if ($result) {
              eval("\$patterns =\"".$this->blockpatterns[1][1]."\";");

              $k = $this->ParseFlag($k);
              $size = explode(',', $k);
              $color = (!empty($size[1])) ? explode('/', $size[1]) : '';

              for ($j=0; $j<$size[0]; $j++) {
    $OutText .= $this->ParseFlag($v, $j, $color);
              }
            }
            $S=preg_replace($patterns, $OutText, $S);
          }
        }
        return $S;
      }

      function ParseRBlock($S) {
        $count = preg_match_all($this->blockpatterns[0][0], $S, $OUT);
        for ($i=0; $i<$count; $i++) {
    $h = $OUT[1][$i];
    $k = $OUT[2][$i];
    $c = $OUT[3][$i];
    $v = $OUT[4][$i];
    if (!empty($v)) {
    $OutText = "";
    if (!empty($c)) {
    $c = $this->ParseFlag($c);
              eval("\$result =".$c.";");
            } else $result = TRUE;
            if ($result) {
              eval("\$patterns =\"".$this->blockpatterns[0][1]."\";");

              $k = $this->ParseFlag($k);
              $size = explode(',', $k);
              $color = (!empty($size[1])) ? explode('/', $size[1]) : '';

              for ($j=0; $j<$size[0]; $j++) {
    $OutText .= $this->ParseFlag($v, $j, $color);
              }
            }
            $S=preg_replace($patterns, $OutText, $S);
          }
        }
        return $S;
      }

      function ParseMBlock($S) {
        $count = preg_match_all($this->blockpatterns[2][0], $S, $OUT);
        for ($i=0; $i<$count; $i++) {
    $h = $OUT[1][$i];
    $c = $OUT[2][$i];
    $v = $OUT[3][$i];
    if (!empty($v)) {
    $OutText = "";
    if (!empty($c)) {
    $c = $this->ParseFlag($c);
              eval("\$result =".$c.";");
            } else $result = TRUE;
            if ($result) {
              eval("\$patterns =\"".$this->blockpatterns[2][1]."\";");

              $c = $this->ParseFlag($c);
              $OutText = ($this->ParseBool($c)) ? $this->ParseFlag($v) : "";
            }
            $S=preg_replace($patterns, $OutText, $S);
          }
        }
        return $S;
      }

      function ParseBool($S) {
        $OPList = "AND,OR";
        $OPin = 0;
        $r=0;
        $OP = explode(',', $OPList);
        for ($i=0; $i<2; $i++) {
    unset($k);
    $k = explode($Op[$i], $S);
    $count = sizeof($k);
    if ($count>1) {
            for ($j=0; $j<$count; $j++) {
    eval("\$RE = ".$k[$j].";");
    $r += ($RE) ? 1 : 0;
    }
    $OPIN = 1;
    }
    }
    if ($OPIN==0) {
    eval("\$RE = ".$S.";");
    $r += ($RE) ? 1 : 0;
    }
    return $r;
    }
    }

    ?>


    ----
    HEYIN 软件 http://www.heyin.com  

  • [关闭][返回]