Avatar billede sthen Nybegynder
28. maj 2004 - 23:32 Der er 13 kommentarer og
1 løsning

Vise en del af teksten i databasen

Vi kender det allesammen.
Vi søger f.eks. på google.dk og får et (eller som oftest mange) svar retur, hvor søgeordet er fremhævet med fed, og hvor kun en del af teksten vises i outputtet.

Hvordan gøres dette?

Indtil videre har jeg nemlig en del artikler i en mysql-database, og v.hj.a. en almindelig søgning kan jeg godt få udtrækket vist, og søgeordet markeret med fed.

Dette gør jeg v.hj.a. følgende:

($result = mysql_query("select * from artikler where tekst like '%$soeg%' order by dato ")) || die(mysql_error());

while($data = mysql_fetch_array($result)) {

$soeg2 = preg_quote($soeg);
$data['tekst'] = preg_replace("/($soeg2)/im",'<b>\1</b>',$data['tekst']);

echo $data['tekst'];

}

(forkortet udgave)

mit spørgsmål er nu:
Hvordan kringler jeg det nu, så det ikke er HELE teksten der vises som output, men kun en del af den (naturligvis den del hvor søgeordet indgår).
Det kan jo godt være at søgeordet står midt nede i teksten, og derfor skal tekstoutputtet i så fald vises med ...$data['tekst']... - men naturligvis skal vi kun have de tre prikker HVIS der udelades noget på den side af det viste hvor prikkerne står.

Jeg vil tro at det er noget i stil med følgende jeg skal bruge, men jeg kan ikke rigtigt få de to ting til at "snakke sammen"

if (strlen($data['tekst']) > 75) {
  $data['tekst'] = substr($data['tekst'],0,75);
  $data['tekst'] = substr($data['tekst'],0,strrpos($data['tekst'],' ')).' ...';
echo $data['tekst'];

Hvis I synes at det er for få point må I sige til. Jeg vil hellere give flere point og så få det løst.
Avatar billede dennismp Nybegynder
28. maj 2004 - 23:50 #1
Noget i stil med dette?
<?php
$text = <<<EOD
Hvordan kringler jeg det nu, så det ikke er HELE teksten der vises som output, men kun en del af den (naturligvis den del hvor søgeordet indgår).
Det kan jo godt være at søgeordet står midt nede i teksten, og derfor skal tekstoutputtet i så fald vises med ...... - men naturligvis skal vi kun have de tre prikker HVIS der udelades noget på den side af det viste hvor prikkerne står.
EOD;

$term = 'nede'; // Hvad der søges efter
$display = 20;  // antal tegn der vises før/efter

$pos = strpos($text,$term);
$beginpos = $pos - $display;
$endpos = $pos + $display + strlen($term);
if( $beginpos < 0 )
    $beginpos = 0;
if( $beginpos == 0 )
    $pre = '';
else
    $pre = '...';
if( $endpos >= strlen($text) )
    $post = '';
else
    $post = '...';
$text =  substr($text,$beginpos,($endpos-$beginpos+strlen($term)));
$term_preg = preg_quote($term);
$text = preg_replace("/($term)/im",'<b>\1</b>',$text);

print $pre.$text.$post;
?>
Avatar billede sthen Nybegynder
28. maj 2004 - 23:55 #2
>> dennismp

Hvad mener du med:
$text = <<<EOD
??????????
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:00 #3
Det er bare en anden måde at lave en string. Det er det samme som

$text = "Hvordan kringler jeg det nu, så det ikke er HELE teksten der vises som output, men kun en del af den (naturligvis den del hvor søgeordet indgår). Det kan jo godt være at søgeordet står midt nede i teksten, og derfor skal tekstoutputtet i så fald vises med ...... - men naturligvis skal vi kun have de tre prikker HVIS der udelades noget på den side af det viste hvor prikkerne står.";

Læs evt:
http://dk2.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
Avatar billede sthen Nybegynder
29. maj 2004 - 00:11 #4
Det ser spændende ud.
Jeg har ikke testet det endnu, men umiddelbart ser dt ud somom det burde virke, så læg lige et svar hvis du vil have points
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:19 #5
Avatar billede sthen Nybegynder
29. maj 2004 - 00:22 #6
Meget flot
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:25 #7
Goodie..

Du melder bare tilbage, hvis der opstår problemer.
Avatar billede sthen Nybegynder
29. maj 2004 - 00:32 #8
Har faktisk allerede fundet en lille misser.

Hvis du f.eks. søger på ordet "hvis", så vises det kun hvis jeg skriver det hele med store bogstaver (som det står i søgeteksten). Kan det mon ordnes, så søgningen ikke bliver case-sensitive?
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:35 #9
ja, du skal bar ebruge stripos istedet for strpos.
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:35 #10
nej vent lidt :-)
Avatar billede sthen Nybegynder
29. maj 2004 - 00:37 #11
Er det ikke denne:
$text = preg_replace("/($term)/im",'<b>\1</b>',$text);

der skal rettes til:
$text = preg_replace("/($term_preg)/im",'<b>\1</b>',$text);
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:38 #12
Du kan, hvis du som jeg, bruger php4 lige tilføje:

if(! function_exists('stripos') ) {
function stripos($haystack, $needle, $offset=0) {
  return strpos(strtolower($haystack), strtolower($needle), $offset);
}
}

så kan du snildt bruge stripos som jeg foreslog før.
Avatar billede dennismp Nybegynder
29. maj 2004 - 00:39 #13
Jo, det skal også rettes.
Avatar billede sthen Nybegynder
29. maj 2004 - 00:40 #14
Thank you - så funker det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester