2010-07-01 19 views
7

Oto co nie działa dla mnie:Limit tekstowy PHP NIE zawiera znaczników html?

<?php 
$string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.'; 
$limited = substr($string, 0, 100).'...'; 
echo $string; 
?> 

Chcę ograniczyć widoczny tekst do 100 znaków, ale przy użyciu substr() jest w tym również niewidocznym tekstu w limicie (<a href="http://www.jackismydog.com"> i </a>), który odbywa się 41 z dostępnych 100 znaków.

Czy istnieje sposób na ograniczenie tekstu, aby słowo "Jack" z linku zostało uwzględnione w limicie, ale nie było to <a href="http://www.jackismydog.com"> lub </a>?

Edit: Chcę utrzymać ogniwo w łańcuchu, po prostu nie liczyć jego długość w kierunku granicy ..

Odpowiedz

4

Funkcja obciąć słowa w kodzie HTML:

//+ Jonas Raoni Soares Silva 
//@ http://jsfromhell.com 
function truncate($text, $length, $suffix = '&hellip;', $isHTML = true) { 
    $i = 0; 
    $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true); 
    $tags = array(); 
    if($isHTML){ 
     preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 
     foreach($m as $o){ 
      if($o[0][1] - $i >= $length) 
       break; 
      $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1); 
      // test if the tag is unpaired, then we mustn't save them 
      if($t[0] != '/' && (!isset($simpleTags[$t]))) 
       $tags[] = $t; 
      elseif(end($tags) == substr($t, 1)) 
       array_pop($tags); 
      $i += $o[1][1] - $o[0][1]; 
     } 
    } 

    // output without closing tags 
    $output = substr($text, 0, $length = min(strlen($text), $length + $i)); 
    // closing tags 
    $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : ''); 

    // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">) 
    $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE))); 
    // Append closing tags to output 
    $output.=$output2; 

    // Get everything until last space 
    $one = substr($output, 0, $pos); 
    // Get the rest 
    $two = substr($output, $pos, (strlen($output) - $pos)); 
    // Extract all tags from the last bit 
    preg_match_all('/<(.*?)>/s', $two, $tags); 
    // Add suffix if needed 
    if (strlen($text) > $length) { $one .= $suffix; } 
    // Re-attach tags 
    $output = $one . implode($tags[0]); 

    //added to remove unnecessary closure 
    $output = str_replace('</!-->','',$output); 

    return $output; 
} 

Źródło: http://snippets.dzone.com/posts/show/7125

2

Jeśli chcesz ograniczyć część tekstową, trzeba przeanalizować i sprawdzić limit siebie . Najprostszym sposobem jest:

if (strlen(strip_tags($string)) > 100) 
{ 
    // the url inside $url is too big 
} 
else 
{ 
    // the url inside $url fits 
} 
+0

Nie zapomnij zastąpić 'strlen' z' mb_strlen', jeśli tekst jest wielobajtowy. – machineaddict

2

Nie łatwo - można oczywiście użyć strip_tags DE-htmlise ciąg, ale poza tym nie ma łatwo naprawić.

+0

Rozwiązanie mojego problemu! Dzięki :) – yanike

3

Najprostszym sposobem byłoby przeanalizowanie tego w strukturze DOM. Możesz użyć do tego celu DOMDocument. Następnie możesz po prostu przejść przez elementy i wprowadzić dowolne zmiany w treści.

Innym podejściem byłoby wykonanie dwuprzebiegowego wyszukiwania i zamiany wyrażenia - najpierw użyj wyrażenia regularnego, aby znaleźć zawartość tagów, a następnie użyj wyrażenia regularnego, aby zastąpić zawartość skróconą zawartością. Można to osiągnąć za pomocą zwykłych funkcji preg_ *.

1

można spróbować tego, pracował dla mnie, jeśli żadne znaczniki są w string $ różnią będzie mieć wartość 0 dawania $ stringi oryginalnej wartości 100

<?php 
$string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.'; 

$stringall=strlen($string); 
$striphtml = strip_tags($string); 
$stringnohtml=strlen(striphtml); 
$differ=($stringall-$stringnohtml); 
$stringsize=($differ + 100); 
$limited = substr($string, 0, $stringsize).'...'; 
echo $limited; 
?> 
+0

$ stringnohtml = strlen (striphtml); powinno być $ stringnohtml = strlen ($ striphtml); – raison