6

たとえば、検索キーワードが存在するスニペットを返すだけです。

また、テキストの一部が「...」に置き換えられます。

PHP と MySQL でその目標を達成することは可能ですか?

4

4 に答える 4

9

複数のフレーズを使用できるように、deceze の機能をわずかに変更しました。たとえば、フレーズを「testa testb」にすることができ、testa が見つからない場合は 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; 
   } 

ハイライト機能

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;}
于 2009-09-10T08:52:47.780 に答える
6

複数の複数のキーワードと複数の出現に対する私の解決策(大文字と小文字を区別しないアクセントにも機能します):

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

//lookahead/behind assertions ensures cut between words
$s = '\s\x00-/:-@\[-`{-~'; //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;
}

これは、クエリ = "švihov prohlídkám" の結果の例です。

結果

于 2014-04-27T22:52:13.403 に答える
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;
}

Cake TextHelperから恥知らずに盗まれました。

于 2009-08-18T07:31:00.943 に答える
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

これはおそらくあなたが望むものです(編集):

$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);
于 2009-08-18T06:42:57.153 に答える