How to generate a fragment similar to those generated by Google using PHP and MySQL?

For example, it simply returns the fragment around which the search keyword exists.

And part of the text is replaced by "...".

Is it possible to achieve this with PHP and MySQL?

+6
php mysql search code-snippets
source share
4 answers

Modified demotion function to allow multiple phrases. for example, your phrase may be "testa testb", and if it does not find testa, then it will go to 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; } 

Backlight function

 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;} 
+8
source share

My solution for multiple multiple keywords and multiple occurrences (also works for case insensitive accents):

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

This is an example result for the query = "švihov prohlídkám"

Result

+5
source share
 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 stolen from Cake TextHelper .

+4
source share
 $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 

This is probably what you want (EDIT):

 $string1="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry 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
source share

All Articles