截断HTML错误? [英] HTML errors when truncating?

查看:83
本文介绍了截断HTML错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下函数:

 函数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)。 $垫;
}
}

return $ string;
}

如果我有以下代码:

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

它会在某些时候切断......换句话说,我们以: p>

 < div style =bla:bla;> somet 

即,一个未封闭的div标签。如何解决此问题?



更新:



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

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

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

解决方案

不要截断 $ html ,而是适合的真实文本。要获取文本,可以使用php的xml函数( DOM ,一个href =http://php.net/manual/book.simplexml.php =nofollow> 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);

//使用id = bla
$ bla = $ xpath->查询('// div [@ id =bla]') - >项(0);
if($ bla instanceof DomNode){

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



//收集结果,这是由于dom-> loadhtml包装加载的字符串
//如果不存在HTML / body
$ result ='';
foreach($ xpath-> query('body / *')as $ childNode){
$。= $ dom-> saveHtml($ childNode);
}

echo $ result;


I have the following function:

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; 
}

If i have the following code:

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

It will cut off at somet..... In other words, we end with:

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

I.e. an unclosed div tag. How do I go about solving this?

Update:

I don't want to truncate only when I get to the . I want something that can automatically add divs. In this case, the output should be:

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

I.e. It actually added the because it knew it was unclosed? Am I correct in assuming I must use something like html purifier for this?

解决方案

Don't truncate the $html but rather the real text where it's appropriate. To get hold of the text, you could use php's xml functions (DOM, SimpleXml) or regular expression. Though I'd advice the first.

Example using 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;

这篇关于截断HTML错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆