The korean string cutting test
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('/'/','/&/','/&(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)/','&\\1',$str);
else return str_replace('&','&',$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($str, 0, $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('&','&',$str);
}
return $str;
}
} // end of strcut class
//error_reporting (E_ALL ^ E_NOTICE);
## test page
##
$teststr = 'dkdk &lt; Çѱ۳ª¶ó&#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('&','&',$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