2016-03-03 68 views
0

我從discuz論壇腳本中看到了一個php函數。它的HTML包裝特殊字符<「> &與控制字符SOH,即CHR(1)象下面這樣:。。?用SOH控制字符包裝html特殊字符

<?php 
$pre = chr(1); 
$end = chr(1); 
$string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), $string); 
?> 

這是什麼行動的目的和運作 全功能如下:

<?php 
function cutstr($string, $length, $dot = ' ...') { 
    if(strlen($string) <= $length) { 
     return $string; 
    } 

    $pre = chr(1); 
    $end = chr(1); 
    $string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), $string); 

    $strcut = ''; 
    if(strtolower(CHARSET) == 'utf-8') { 

     $n = $tn = $noc = 0; 
     while($n < strlen($string)) { 

      $t = ord($string[$n]); 
      if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { 
       $tn = 1; $n++; $noc++; 
      } elseif(194 <= $t && $t <= 223) { 
       $tn = 2; $n += 2; $noc += 2; 
      } elseif(224 <= $t && $t <= 239) { 
       $tn = 3; $n += 3; $noc += 2; 
      } elseif(240 <= $t && $t <= 247) { 
       $tn = 4; $n += 4; $noc += 2; 
      } elseif(248 <= $t && $t <= 251) { 
       $tn = 5; $n += 5; $noc += 2; 
      } elseif($t == 252 || $t == 253) { 
       $tn = 6; $n += 6; $noc += 2; 
      } else { 
       $n++; 
      } 

      if($noc >= $length) { 
       break; 
      } 

     } 
     if($noc > $length) { 
      $n -= $tn; 
     } 

     $strcut = substr($string, 0, $n); 

    } else { 
     $_length = $length - 1; 
     for($i = 0; $i < $length; $i++) { 
      if(ord($string[$i]) <= 127) { 
       $strcut .= $string[$i]; 
      } else if($i < $_length) { 
       $strcut .= $string[$i].$string[++$i]; 
      } 
     } 
    } 

    $strcut = str_replace(array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), array('&amp;', '&quot;', '&lt;', '&gt;'), $strcut); 

    $pos = strrpos($strcut, chr(1)); 
    if($pos !== false) { 
     $strcut = substr($strcut,0,$pos); 
    } 
    return $strcut.$dot; 
} 
?> 

欣賞提前。

回答

2

代碼試圖確定有多少打印字符有字符串中,因此它可以將其縮寫爲一定的長度,所以在開始的時候要REPL使用它們的單個字符等同所有HTML實體。 &amp;被替換爲&。最後,它想把它們放回原來的位置。

但如果剛剛更換&amp;&,並在年底更換&&amp;,它會做錯誤的事情,如果原始字符串包含的任何&這是不是&amp;(或其他實體的一部分是第一次更換流程)。所以它用SOH包裝了所有的替換項(決定大小的循環忽略了控制字符)。然後在最後,它只會用它們的實體替換包裝的字符,所以這隻會取消原來的替換。

+0

謝謝你的快速和明確的答案。 – Hanmelt