2010-10-23 87 views
0

我試圖將省略號添加到此php函數生成的截斷字符串的末尾。它是Wordpress插件的一部分。但很可惜,我只是學習PHP的....將省略號添加到WordPress插件中的截斷字符串末尾

我試圖接近函數結束結束HTML tag之前打印的省略號,這樣

$truncate .= '... </' . $tag . '>';

但沒有運氣。有任何想法嗎?它必須相當簡單。

這裏的整體功能:

if(!function_exists('yd_cake_truncate')) { 
    function yd_cake_truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false) { 
     if ($considerHtml) { 
      // if the plain text is shorter than the maximum length, return the whole text 
      if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) { 
       return $text; 
      } 

      // splits all html-tags to scanable lines 
      preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER); 

      $total_length = strlen($ending); 
      $open_tags = array(); 
      $truncate = ''; 

      foreach ($lines as $line_matchings) { 
       // if there is any html-tag in this line, handle it and add it (uncounted) to the output 
       if (!empty($line_matchings[1])) { 
        // if it's an "empty element" with or without xhtml-conform closing slash (f.e. <br/>) 
        if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) { 
         // do nothing 
         // if tag is a closing tag (f.e. </b>) 
        } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) { 
         // delete tag from $open_tags list 
         $pos = array_search($tag_matchings[1], $open_tags); 
         if ($pos !== false) { 
          unset($open_tags[$pos]); 
         } 
         // if tag is an opening tag (f.e. <b>) 
        } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) { 
         // add tag to the beginning of $open_tags list 
         array_unshift($open_tags, strtolower($tag_matchings[1])); 
        } 
        // add html-tag to $truncate'd text 
        $truncate .= $line_matchings[1]; 
       } 

       // calculate the length of the plain text part of the line; handle entities as one character 
       $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2])); 
       if ($total_length+$content_length> $length) { 
        // the number of characters which are left 
        $left = $length - $total_length; 
        $entities_length = 0; 
        // search for html entities 
        if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) { 
         // calculate the real length of all entities in the legal range 
         foreach ($entities[0] as $entity) { 
          if ($entity[1]+1-$entities_length <= $left) { 
           $left--; 
           $entities_length += strlen($entity[0]); 
          } else { 
           // no more characters left 
           break; 
          } 
         } 
        } 
        $truncate .= substr($line_matchings[2], 0, $left+$entities_length); 
        // maximum lenght is reached, so get off the loop 
        break; 
       } else { 
        $truncate .= $line_matchings[2]; 
        $total_length += $content_length; 
       } 

       // if the maximum length is reached, get off the loop 
       if($total_length>= $length) { 
        break; 
       } 
      } 
     } else { 
      if (strlen($text) <= $length) { 
       return $text; 
      } else { 
       $truncate = substr($text, 0, $length - strlen($ending)); 
      } 
     } 

     // if the words shouldn't be cut in the middle... 
     if (!$exact) { 
      // ...search the last occurance of a space... 
      $spacepos = strrpos($truncate, ' '); 
      if (isset($spacepos)) { 
       // ...and cut the text in this position 
       $truncate = substr($truncate, 0, $spacepos); 
      } 
     } 

     // add the defined ending to the text 
     $truncate .= $ending; 

     if($considerHtml) { 
      // close all unclosed html-tags 
      foreach ($open_tags as $tag) { 
        $truncate .= '</' . $tag . '>'; 
      } 
     } 

     return $truncate; 

    } 
} 

回答

1

函數簽名看起來像它使用$ending參數默認添加省略號截斷字符串的結尾:

yd_cake_truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false)

展望進一步下降,$ending附加到函數結尾處的截斷字符串:

// add the defined ending to the text 
    $truncate .= $ending; 

當您嘗試使用它時,您如何調用此函數?

+0

可以使用省略號charcode而不是三個句號,… – pharalia 2010-10-23 00:45:10

+0

你是對的;沒有看到。該小部件提供顯示帖子標題或摘錄的選擇,並且向摘錄添加省略號,但不添加標題。在我看來,'return $ truncate'返回輸出的html,但我不確定。其他函數處理縮略圖,但這是處理截斷的唯一函數。 – markratledge 2010-10-23 00:55:07

+0

如果函數接收到html中的文本,它將使用html返回截斷的文本,做一些小腿工作以確保html本身不被計算在行長內。您可能想要查看插件分支的位置,並選擇使用帖子標題或摘錄。我的直覺是,這個函數被稱爲摘錄而不是帖子標題,只是在帖子標題案例中調用它應該得到你想要的結果。 – andrewle 2010-10-23 01:26:53

相關問題