The korean string cutting test


This string : included HTML TAG yes no
HTML cutting test :
¼Ò½º´Ý±â
<?php
##
## this file name is 'class.strcut.php'
##
## korean string cut class
##
## author  : san2 <san2(at)linuxchannel.net>, http://linuxchannel.net
##
## changes :
##    - 2002.11.22, add check_tag()
##    - 2002.10.04
##
## download :
##    - http://ftp.linuxchannel.net/devel/php_strcut/
##
## demo :
##    - http://linuxchannel.net/gaggle/strcut.php
##
## usage :
##    $strcut = new strcut;
##    echo $strcut->cut('string...string',10);
##

class strcut
{
  
## reference : http://jsboard.kldp.org/
  ##
  
function unhtmlspecialchars($str)
  {
    
$tr array_flip(get_html_translation_table(HTML_SPECIALCHARS));
    
$str preg_replace(array('/&#039;/','/&amp;/','/&(nbsp;|#032)/'),array("'",'&',' '),$str);
    
$str strtr($str,$tr);

    return 
$str;
  }

  
## source : http://jsboard.kldp.org/
  ##
  ## arguments :
  ##    $str   : string, target string
  ##    $html  : boolean, if $str included HTML TAG, then set to 1
  ##
  
function ugly_han($str$html=0)
  {
    if(!
$html) return preg_replace('/&amp;(#|amp)/','&\\1',$str);                                                     
    else return 
str_replace('&amp;','&',$str);
  }

  function 
check_tag($str)
  {
    
## type1 : <IMG SRC=ddd>, <BR>, <P>, etc ugly TAG
    ##
    
if(preg_match(';<[^>]*$;',$str)) {
        
$str preg_replace(';<[^>]*$;','',$str);
        
//$type = ' _1'; // debugging
    
}

    
## type2 : <A HREF=ddd>aaaaa<IMG SRC=xxx.img></A>, <PRE>dddddd</PRE>
    ##
    
if(!preg_match(';<([A-Z]+)[^>]*>.*</\\1>.*$;i',$str)) {
        
$from = array(';</.*$;',';<([A-Z]+)([^>]*)>(.*)$;i',';<</;',';<[^>]*$;');
        
$to = array('','<\\1\\2>\\3</\\1>','</',''); 
        
$str preg_replace($from,$to,$str);
        
//$type .= ' _2'; // debugging
    
}

    return 
$str $type;
  }

  
## reference : http://www.phpschool.com/bbs2/inc_view.html?id=6167&code=tnt2
  ##
  ## arguments :
  ##    $str   string, target string
  ##    $len   integer, want to cutting length
  ##    $html  boolean, default 0, if $str included HTML TAG, then set to 1
  ##    $ugly  boolean, default 0, if checked ugly_han(), then set to 1
  ##
  ## return :
  ##    $str   string, cutted string
  ##
  
function cut($str$len$html=0$ugly=0)
  {
    if(
strlen($str) <= $len) return $str;

    if(!
$ugly$str $this->ugly_han($str,$html);
    if(!
$html$str $this->unhtmlspecialchars($str);

    
$i $len 1;
    while(
ord($str[$i]) & 0x80$i--;

    
$fix $len - (($len $i 1) & 1);
    
$cutted substr($str0$fix);

    
## good idea, but bad speed
    ##
    //if($str[$fix-1].$str[$fix] == '&#') $str = preg_replace('/&[^&]*$/','',$cutted);
    //else $str = preg_replace('/&#[0-9]*$/','',$cutted);

    
$str preg_replace('/(&#[0-9]*|&)$/','',$cutted);

    if(
$html$str $this->check_tag($str);
    else {
        
$str htmlspecialchars($str);
        
$str str_replace('&amp;','&',$str);
    }

    return 
$str;
  }
// end of strcut class

//error_reporting (E_ALL ^ E_NOTICE);

## test page
##

$teststr 'dkdk &amp;lt; Çѱ۳ª¶ó&amp;#039;´ç³ª¶ó ±º´ë& gogÁd Œc¹æ°¢ÇÏ...&o';
$htmlstr '<A HREF="ddddddd">Çѱ۳ª¶ó<IMG SRC="kkk.gif">_V.V_</A>ccc<BR>dd<P>ee';

if(
$_GET['htmlstr']) {
    
$_POST['str'] = $htmlstr;
    
$_POST['html'] = 1;
}

$htmlstr htmlspecialchars($htmlstr);
$checked[($_POST[html])?1:0] = 'CHECKED';
$str stripslashes(chop($_POST[str]));
$viewstr str_replace('&','&amp;',$str);
$size 80;

if(!
$viewstr$viewstr $teststr;
if(
preg_match('/MSIE/',$_SERVER[HTTP_USER_AGENT])) $vs '¼Ò½º(C): Alt + V + C';
else if(
preg_match('/Mozilla/',$_SERVER[HTTP_USER_AGENT])) {
    
$vs 'Page Source: Ctrl + U';
    
$size round($size 0.9);
}
else 
$vs 'Page source';

echo <<<_EOF_
<H1>The korean string cutting test</H1>
<FORM METHOD='post' ACTION='
$_SERVER[PHP_SELF]'>
    <TEXTAREA NAME='str' ROWS='5' COLS='
$size'>$viewstr</TEXTAREA>
    <BR>
    This string : included HTML TAG
    <INPUT TYPE='radio' NAME='html' VALUE=1 
$checked[1]>yes
    <INPUT TYPE='radio' NAME='html' VALUE=0 
$checked[0]>no
    <INPUT TYPE='submit' VALUE='  result  '>
</FORM>
<A HREF='
$_SERVER[PHP_SELF]?htmlstr=1'>HTML cutting test</A> : $htmlstr
<HR>\n
_EOF_;


if(
$_GET[view] && !$str) {
    echo 
"<A HREF='$PHP_SELF'>¼Ò½º´Ý±â</A>\n<HR>\n";
    
highlight_file(basename($_SERVER[PHP_SELF]));
    
//exit;
}
else {
    echo 
"<A HREF='$PHP_SELF?view=1'>¼Ò½ºº¸±â</A>\n<HR>\n";
    echo 
"Result : È­¸é»ó¿¡ º¸À̴ result ÀÓ, ½ÇÁ¦ stringÀº À¥ºê¶ó¿ìÀúÀÇ $vs ¼±ÅÃ<HR>\n";
    
//echo "<FORM>\n"; // for NS/4.x

    
$strcut = new strcut;
    for(
$i=strlen($str); $i>0$i--) {
        
$cutted $strcut->cut($str,$i,$_POST[html]);
        echo 
sprintf('%03d : ',$i) .
            
" <TEXTAREA ROWS=1 COLS=$size>$cutted</TEXTAREA><BR>\n";
    }
    
//echo "</FORM>\n";
}

?>

Page loading: 0.02(server) + (network) + (browser) seconds