Например, он просто возвращает фрагмент, по которому существует ключевое слово поиска.
И часть текста заменяется на «…».
Можно ли достичь этой цели с помощью PHP и MySQL?
Модифицированная функция демеси немного, чтобы допускать несколько фраз. например, ваша фраза может быть «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;}
Мое решение для нескольких множественных ключевых слов и множественных вхождений (также работает для акцентов без учета регистра):
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"
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 .
$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
Вероятно, это то, что вы хотите (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);