2011-08-23 120 views
1

我有以下功能:截断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 

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

更新:

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

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

即,它实际上增加了,因为它知道它没有关闭?我是否正确地假设我必须使用像html净化器这样的东西?

+0

指望标记和属性和截断算属性值呢? – hakre

回答

5

不要截断$html,而是截取真实文本适合的地方。要获取文本,可以使用php的xml函数(DOM,SimpleXml)或正则表达式。虽然我会建议第一个。

示例使用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; 
+0

好吧,现在我需要一个可以去掉标签,截断它,然后重新添加相关html标签的函数? – coderama

+0

不,您将使用给定的库中的一个来查找html中的文本*并将其截断。这样html结构将保持不变。我会尽快提供一个例子。 – Yoshi

+0

+1用于推荐DOM功能。他们是最棒的! – jolt

0

那么,在truncate函数中,只需查找开始标签,对它们进行计数,然后查找这些标签以关闭,当所有标签都关闭时,这就是您的字符串。

+0

我想你误会了。请检查我的更新。 – coderama

+0

所以你想添加html标签到最后? –

+0

或者:如果它们在截断结束时仍处于打开状态,请关闭它们。 – hakre