截断时出现HTML错误?

时间:2011-08-23 10:34:53

标签: php html

我有以下功能:

function truncate($string, $limit, $break=".", $pad="...") { 
  if(strlen($string) <= $limit) return $string; 
    if(false !== ($breakpoint = strpos($string, $break, $limit))) { 
      if($breakpoint < strlen($string) - 1) { 
        $string = substr($string, 0, $breakpoint) . $pad; 
      } 
    } 

    return $string; 
}

如果我有以下代码:

$html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>';
print truncate($html, 30);

它会在某些方面切断.....换句话说,我们以:

结束
<div style="bla: bla;">somet 

即。一个未封闭的div标签。我该如何解决这个问题?

更新

我不想在我到达时才截断。我想要一些可以自动添加div的东西。在这种情况下,输出应为:

     <div style="bla: bla;">somet</div>

即。它实际上添加了因为它知道它是未封闭的?我是否正确地假设我必须使用类似html净化器的东西?

2 个答案:

答案 0 :(得分:5)

不要截断$html,而是截断适当的真实文本。要掌握文本,可以使用php的xml函数(DOMSimpleXml)或正则表达式。虽然我建议第一个。

使用Dom的例子:

$html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>';

$dom = new DomDocument;
$dom->loadHtml($html);

$xpath = new DomXpath($dom);

// example of getting a div with id=bla
$bla = $xpath->query('//div[@id="bla"]')->item(0);
if ($bla instanceof DomNode) {

  // truncate here
  if (strlen($bla->nodeValue) > 10) {
    $bla->nodeValue = substr($bla->nodeValue, 0, 10) . '...';
  }
}

// collect result, this is needed due to dom->loadhtml wrapping the loaded string
// with html/body if not present
$result = '';
foreach ($xpath->query('//body/*') as $childNode) {
  $result .= $dom->saveHtml($childNode);
}

echo $result;

答案 1 :(得分:0)

好吧,在截断函数中只需查找开始标记,计算它们,并查找这些标记以关闭,当所有标记都关闭时,这就是你的字符串。