2012-01-01 113 views
3

以下是php中的函數,它接受任何字符串(字符串也包含html標籤),並從變量$ min中提到的字符中返回幾個字。如何從HTML標籤讀取CDATA

function gen_string($string,$min=500,$clean=true) { 

    $text = trim(strip_tags($string)); 

     if(strlen($text)>$min) { 
      $blank = strpos($text,' '); 
      if($blank) { 
       # limit plus last word 
       $extra = strpos(substr($text,$min),' '); 
       $max = $min+$extra; 
       $r = substr($text,0,$max); 
       $query = "select distinct ID from cms_content"; 
       $result = mysql_query($query); 
       $IDlink = 'http://localhost/www/index.php?ID='.$result; 
        if(strlen($text)>=$max && !$clean) $r=trim($r,'.') ; 

      } else { 
       # if there are no spaces 
       $r = substr($text,0,$min).'.........'; 
      } 

     } else { 
      # if original length is lower than limit 
      $r = $text; 
     } 
     return trim($r); 
} 

但問題是,在返回的字符串中,它不會讀取html標記。 那麼如何讓這個函數讀取html標籤,以便返回的字符串必須在格式化的html標籤中?

+0

不錯的問題,+1 – Flavius 2012-01-01 08:28:59

回答

0

你的問題是這樣的:

$text = trim(strip_tags($string)); 

strip_tags將刪除所有的標籤,從而使功能不可能返回任何。

由於您正在剪切部分字符串,因此最終會生成無效的HTML片段。您需要tidyHTMLPurifier以解決此問題。

0

使用tidy構造有效的(X)HTML字符串,它解析爲DOM document,然後使用XPath(未經測試)//body//text()

我已經指出你正確的功能/類的方法,所以你可以打地面運行。

文檔和用戶註釋可能對您特別有用。

POC:

1 <?php 
2 $string = '<p>Hello <b>World <i>out</i><span>there</span></b></p>'; 
3 
4 $string = tidy_repair_string($string); 
5 
6 $doc = new DOMDocument; 
7 $doc->loadHTML($string); 
8 
9 $path = new DOMXPath($doc); 
10 
11 $entries = $path->query('//body//text()'); 
12 
13 $string = NULL; 
14 
15 foreach($entries as $entry) { 
16  if(preg_match('/\w/', $entry->nodeValue)) { 
17   $string .= $entry->nodeValue; 
18  } 
19 } 
20 echo $string; 

輸出:Hello World outthere

+0

我試圖讓我的功能適合文檔示例,但不能得到這個... :( – 2012-01-01 09:10:02

+0

我也試過這個,但沒有工作http://css-tricks.com/snippets/ php/truncate-strings/ – 2012-01-01 09:10:56

+0

嗯,我的答案表明你用這種新方法重寫你的函數。 – Flavius 2012-01-01 09:11:52