2009-08-18 3 views

Répondre

0
$snippet = "//mysql query"; 

function trimmer($updates,$wrds){ 
    if(strlen($updates)<=$wrds){ 
     return $updates; 
    }else{ 
    $marker = strrpos(substr($updates,0,$wrds),' '); 
    $string = substr(substr($updates,0,$wrds),0,$marker)."...";return $string; 
} 

echo trimmer($snippet,200); //You can send the snippet string to this function it searches for the last space if string length is greater than 200 and adds "..." to it 

Ceci est probablement ce que vous voulez (EDIT):

$string1="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; 
function trimmer($updates,$wrds,$pos){ 
    if(strlen($updates)<=$wrds) { 
     return $updates; 
} else { 
     $marker = strrpos(substr($updates,$pos,$wrds),' '); 
     $string = substr(substr($updates,$pos,$wrds),0,$marker)."..."; 
     return $string; 
    } 
} 

$pos = strpos($string1, "dummy"); 
echo trimmer($string1,100,$pos); 
+0

Pensez-vous que si les mots-clés existent 201 caractères depuis le début. Vous avez renvoyé les 200 premiers caractères, mais sans les mots clés inclus. – omg

+0

J'ai ajouté un EDIT ... c'est peut-être ce que vous voulez – halocursed

4
function excerpt($text, $phrase, $radius = 100, $ending = "...") { 
    $phraseLen = strlen($phrase); 
    if ($radius < $phraseLen) { 
     $radius = $phraseLen; 
    } 

    $pos = strpos(strtolower($text), strtolower($phrase)); 

    $startPos = 0; 
    if ($pos > $radius) { 
     $startPos = $pos - $radius; 
    } 

    $textLen = strlen($text); 

    $endPos = $pos + $phraseLen + $radius; 
    if ($endPos >= $textLen) { 
     $endPos = $textLen; 
    } 

    $excerpt = substr($text, $startPos, $endPos - $startPos); 
    if ($startPos != 0) { 
     $excerpt = substr_replace($excerpt, $ending, 0, $phraseLen); 
    } 

    if ($endPos != $textLen) { 
     $excerpt = substr_replace($excerpt, $ending, -$phraseLen); 
    } 

    return $excerpt; 
} 

Shamelessly dérobés aux Cake TextHelper.

8

Modifié la fonction de deceze légèrement pour permettre plusieurs phrases. par exemple. votre phrase peut être "testa testb" et si elle ne trouve pas testa, elle ira à testb.

function excerpt($text, $phrase, $radius = 100, $ending = "...") { 


     $phraseLen = strlen($phrase); 
     if ($radius < $phraseLen) { 
      $radius = $phraseLen; 
     } 

     $phrases = explode (' ',$phrase); 

     foreach ($phrases as $phrase) { 
      $pos = strpos(strtolower($text), strtolower($phrase)); 
      if ($pos > -1) break; 
     } 

     $startPos = 0; 
     if ($pos > $radius) { 
      $startPos = $pos - $radius; 
     } 

     $textLen = strlen($text); 

     $endPos = $pos + $phraseLen + $radius; 
     if ($endPos >= $textLen) { 
      $endPos = $textLen; 
     } 

     $excerpt = substr($text, $startPos, $endPos - $startPos); 
     if ($startPos != 0) { 
      $excerpt = substr_replace($excerpt, $ending, 0, $phraseLen); 
     } 

     if ($endPos != $textLen) { 
      $excerpt = substr_replace($excerpt, $ending, -$phraseLen); 
     } 

     return $excerpt; 
    } 

Sélectionnez la fonction

function highlight($c,$q){ 
$q=explode(' ',str_replace(array('','\\','+','*','?','[','^',']','$','(',')','{','}','=','!','<','>','|',':','#','-','_'),'',$q)); 
for($i=0;$i<sizeOf($q);$i++) 
    $c=preg_replace("/($q[$i])(?![^<]*>)/i","<span class=\"highlight\">\${1}</span>",$c); 
return $c;} 
+0

Pouvez-vous mettre en évidence les phrases? – omg

+1

ajouté la fonction de surbrillance ... –

+1

cela devrait être la réponse acceptée – Kamal

5

Ma solution pour plusieurs mots-clés multiples et plusieurs occurences (fonctionne aussi pour les accents insensibles à la casse):

function excerpt($text, $query) 
{ 
//words 
$words = join('|', explode(' ', preg_quote($query))); 

//lookahead/behind assertions ensures cut between words 
$s = '\s\x00-/:[email protected]\[-`{-~'; //character set for start/end of words 
preg_match_all('#(?<=['.$s.']).{1,30}(('.$words.').{1,30})+(?=['.$s.'])#uis', $text, $matches, PREG_SET_ORDER); 

//delimiter between occurences 
$results = array(); 
foreach($matches as $line) { 
    $results[] = htmlspecialchars($line[0], 0, 'UTF-8'); 
} 
$result = join(' <b>(...)</b> ', $results); 

//highlight 
$result = preg_replace('#'.$words.'#iu', "<span class=\"highlight\">\$0</span>", $result); 

return $result; 
} 

Ceci est par exemple le résultat pour la requête = « Švihov prohlídkám "

Result

+0

fyi- ceci ne semble pas correspondre si la ligne de $ text qui contient $ query n'a pas de nouvelle ligne avant et après. $ text = "\ n $ {text} \ n" est une solution de contournement simple, mais l'expression régulière peut nécessiter un ajustement – dlo

+0

Cela renvoie des extraits très longs si vous avez un texte long et de nombreux hits. – jor

+0

Des trucs géniaux! Merci. –

Questions connexes