/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
markere ord fra søgning
Fra : Martin


Dato : 25-09-09 18:54

Jeg har en mysql database hvor jeg har lavet en søgefunktion:

SELECT feltnavn1, feltnavn2 FROM tabelnavn where feltnavn1 like
'%$soegefelt% OR feltnavn2 like '%$soegefelt% '

Dette virker fint.

Lad os sige jeg søger på sætningen "far til fire": Følgende kommer så frem
i resultatet:
Filmen hedder Far til fire på eventyr

Det, jeg ønsker er, at det man søger på, i dette tilfælde "Far til fire"
bliver markeret med rødt i resultatet.
Dvs resultatet skulle være kodet som flg:

Filmen <span class='rod'>Far til fire</span> på eventyr

Hvordan får man "indhegnet" søgeordene fra søgefeltet med et <span class>?

Er det en form for manipulation af en tekststreng?

Martin



 
 
Bertel Lund Hansen (25-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-09-09 20:49

Martin skrev:

> Det, jeg ønsker er, at det man søger på, i dette tilfælde "Far til fire"
> bliver markeret med rødt i resultatet.
> Dvs resultatet skulle være kodet som flg:

> Filmen <span class='rod'>Far til fire</span> på eventyr

$span0="<span class='rod'>";
$span1="</span>";

$search="far til fire";
$result="Filmen hedder Far til fire på eventyr";

$pos=stripos($result,$search); // Bemærk i'et
$length=strlen($search);

$displaystring=substr($result,0,$pos).$span0.substr($result,$pos,$length).$span1.substr($result,$pos+$length);

> Er det en form for manipulation af en tekststreng?

Ja.

Opskriften (som er utestet) er uafhængig af om der er
overensstemmelse mellem store og små bogstaver i de to strenge.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Martin (25-09-2009)
Kommentar
Fra : Martin


Dato : 25-09-09 23:27

Respekt - det må jeg sige - fungerer bare så fint, Tak for det

Hilsen Martin


"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i en meddelelse
news:j57qb5dp1cumk82h3snfom6fppc2i7u7fm@news.stofanet.dk...
> Martin skrev:
>
>> Det, jeg ønsker er, at det man søger på, i dette tilfælde "Far til fire"
>> bliver markeret med rødt i resultatet.
>> Dvs resultatet skulle være kodet som flg:
>
>> Filmen <span class='rod'>Far til fire</span> på eventyr
>
> $span0="<span class='rod'>";
> $span1="</span>";
>
> $search="far til fire";
> $result="Filmen hedder Far til fire på eventyr";
>
> $pos=stripos($result,$search); // Bemærk i'et
> $length=strlen($search);
>
> $displaystring=substr($result,0,$pos).$span0.substr($result,$pos,$length).$span1.substr($result,$pos+$length);
>
>> Er det en form for manipulation af en tekststreng?
>
> Ja.
>
> Opskriften (som er utestet) er uafhængig af om der er
> overensstemmelse mellem store og små bogstaver i de to strenge.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Philip Nunnegaard (26-09-2009)
Kommentar
Fra : Philip Nunnegaard


Dato : 26-09-09 07:05

Martin skrev:
> Respekt - det må jeg sige - fungerer bare så fint, Tak for det

Også respekt herfra!
Jeg har hidtil kørt med simple replace-sætninger, og de havde netop den
irriterende ting at søgestrengen ikke blev fremhævet, hvis ikke det var
eksakt match på store og små bogstaver.

--
Philip - http://chartbase.dk | http://www.hitsurf.dk

Arne Feldborg (26-09-2009)
Kommentar
Fra : Arne Feldborg


Dato : 26-09-09 08:56

Philip Nunnegaard <nunnenospam@hitsurf.dk> skrev Sat, 26 Sep 2009
08:04:49 +0200


>Jeg har hidtil kørt med simple replace-sætninger, og de havde netop den
>irriterende ting at søgestrengen ikke blev fremhævet, hvis ikke det var
>eksakt match på store og små bogstaver.
>
Til gengæld er den uafhængig af hvor mange gange søgeteksten forekommer.

Med Bertels metode skal man huske at lægge det ind i en løkke, ellers
finder den kun den første forekomst.


Jonathan Stein (27-09-2009)
Kommentar
Fra : Jonathan Stein


Dato : 27-09-09 22:44

Arne Feldborg skrev:

> Til gengæld er den uafhængig af hvor mange gange søgeteksten forekommer.
>
> Med Bertels metode skal man huske at lægge det ind i en løkke, ellers
> finder den kun den første forekomst.

Hvis man vil markere alle forekomster og bevare små/store bogstaver,
skriger det næsten på et regulært udtryk. F.eks. noget i retning af:

$regexp = preg_quote($search);
$highlighted = preg_replace('/('.$regexp.')/i', '<span
class="red">$1</span>', $result);

Første linje kan udelades, hvis man er sikker på, at $search ikke
indeholder noget, der kan ødelægge det regulære udtryk - så bruger man
bare $search direkte i preg_replace.

M.v.h.

Jonathan

--
Er din email vigtig? Er du træt af, at din hjemmeside er nede?
Stabilt webhotel på redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/

Arne Feldborg (28-09-2009)
Kommentar
Fra : Arne Feldborg


Dato : 28-09-09 00:21

Jonathan Stein <jstein@image.dk> skrev Sun, 27 Sep 2009 23:44:08 +0200


>Hvis man vil markere alle forekomster og bevare små/store bogstaver,
>skriger det næsten på et regulært udtryk. F.eks. noget i retning af:
>
Nu er jeg bestemt ikke nogen ørn til regulære udtryk. Derfor forslaget
om en løkke, jeg bruger det selv jævnligt.

Men hvis det kan gøres så enkelt som det du foreslår, så er det jo
alletiders.


Vagn Kofoed (29-09-2009)
Kommentar
Fra : Vagn Kofoed


Dato : 29-09-09 15:07

Eller man kan bruge str_ireplace(), der ændre alle forekomster i strengen.
De to første args kan være arrays, så man i samme hug kan lave felr
search/replace.

Vagn Kofoed

Arne Feldborg wrote in dk.edb.internet.webdesign.serverside.php:
> Philip Nunnegaard <nunnenospam@hitsurf.dk> skrev Sat, 26 Sep 2009
> 08:04:49 +0200
>
>
> Med Bertels metode skal man huske at lægge det ind i en løkke, ellers
> finder den kun den første forekomst.
>


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (29-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 29-09-09 15:36

Vagn Kofoed skrev:

> Eller man kan bruge str_ireplace(), der ændre alle forekomster i strengen.

Jo, men den ændrer dem alle til det der står i replace-strengen
uanset hvilke store og små bogstaver der stod i forvejen. Det var
derfor jeg gik den tilsyneladende omvej.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Bertel Lund Hansen (29-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 29-09-09 16:48

Bertel Lund Hansen skrev:

> Vagn Kofoed skrev:
>
> > Eller man kan bruge str_ireplace(), der ændre alle forekomster i strengen.
>
> Jo, men den ændrer dem alle til det der står i replace-strengen
> uanset hvilke store og små bogstaver der stod i forvejen. Det var
> derfor jeg gik den tilsyneladende omvej.

Hvis nogen skulle være interesseret, så er her hele den kode jeg
bruger på usenet.dk's søgefunktion. Den leder i alle filer med et givet
filtypenavn, og den finder alle forekomster af søgestrengen, viser et
udsnit og fremhæver det søgte. Jeg bruger samme princip på fifuso.dk.

Hvis søgestrengen kun indeholder små bogstaver, tages der ikke
hensyn til små eller store bogstaver, men hvis blot ét tegn er et
stort bogstav, så søges der på den præcise streng.

Det er en begrænsning at der ikke kan bruges logiske udtryk.
Der søges på det man skriver og ikke andet. Det er også en
begrænsning at alle træffere vises i én lang smøre. Der er ikke
indbygget at man kan bede om f.eks. 20 ad gangen.

Siden behandler $_POST-input fra en anden side

<?
$look=$_POST['look'];
$lookfor=$_POST['lookfor'];
$length=strlen($lookfor);
$lowcase=$lookfor==strtolower($lookfor);
$udsnit=45;
$fundetspan="<span style='background:yellow'>";
$slutspan="</span>";
// ---------------- Main ----------------
if ($look) {
   $fundet=0;
   $message='';
   $searchfolders=glob('*',GLOB_ONLYDIR);
   array_unshift($searchfolders,'.');
   foreach ($searchfolders as $searchfolder) {
      $searchfiles=glob($searchfolder.'/*.php');
      foreach ($searchfiles as $searchfile) {
         $content=strip_tags(file_get_contents($searchfile));
         $pos=($lowcase) ? stripos($content,$lookfor) : strpos($content,$lookfor);
         if ($pos!==false) {
            // *** Disse 5 linjer har at gøre med et specifikt format på filnavnene:
            $start=strpos($searchfile,'/')+1;
            $lng=strpos($searchfile,'.',2)-$start;
            $pagecode=substr($searchfile,$start,$lng);
            $page=$sider[$pagecode][0];
            $message.="<h4><a href='/?side=$pagecode'>$page</a></h4>\n";
            // ***
            while ($pos!==false) {
               ++$fundet;
               $start=$pos-$udsnit;
               if ($start<0) $start=0;
               $show_raw=substr($content,$start,$udsnit+$udsnit);
               $found=substr($content,$pos,$length);
               $show_next=str_replace($found,$fundetspan.$found.$slutspan,$show_raw);
               $start=strpos($show_next,' ')+1;
               $lng=strrpos($show_next,' ')-$start;
               $show=substr($show_next,$start,$lng);
               $message.="<p><b>$fundet.</b> $show</p>\n";
               $pos=($lowcase) ? stripos($content,$lookfor,$pos+1) : strpos($content,$lookfor,$pos+1);
            }
         }
      }
   }
   if (!$fundet) echo "Der var ingen træffere.";
   else {
      echo "<h4>Der var $fundet træffere:</h4>\n";
      echo $message;
   }
}
?>

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Vagn Kofoed (29-09-2009)
Kommentar
Fra : Vagn Kofoed


Dato : 29-09-09 18:53

Bertel Lund Hansen wrote in dk.edb.internet.webdesign.serverside.php:
> Vagn Kofoed skrev:
>
> > Eller man kan bruge str_ireplace(), der ændre alle forekomster i strengen.
>
> Jo, men den ændrer dem alle til det der står i replace-strengen
> uanset hvilke store og små bogstaver der stod i forvejen. Det var
> derfor jeg gik den tilsyneladende omvej.

Er det så str_replace() uden i for ignore case?
Vagn

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Philip Nunnegaard (29-09-2009)
Kommentar
Fra : Philip Nunnegaard


Dato : 29-09-09 19:29

Vagn Kofoed skrev:

> Er det så str_replace() uden i for ignore case?
> Vagn

Den ignorerer desværre heller ikke store og små bogstaver.

--
Philip - http://chartbase.dk | http://www.hitsurf.dk

Birger Sørensen (30-09-2009)
Kommentar
Fra : Birger Sørensen


Dato : 30-09-09 01:43

Philip Nunnegaard kom med denne ide:
> Vagn Kofoed skrev:
>
>> Er det så str_replace() uden i for ignore case?
>> Vagn
>
> Den ignorerer desværre heller ikke store og små bogstaver.

str_replace() for at erstatte eksakt matches
str_ireplace() for at erstatte uanset case

http://dk.php.net/manual/en/function.str-replace.php
http://dk.php.net/manual/en/function.str-ireplace.php

Jeg er ikke sikker på, hvad der menes med desværre.
Hvis man vil have den streng der indsættes anderledes end eksakt, kan
man jo bruge strtolower() eller strtoupper() på den først...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Philip Nunnegaard (30-09-2009)
Kommentar
Fra : Philip Nunnegaard


Dato : 30-09-09 06:13

Birger Sørensen skrev:

> Jeg er ikke sikker på, hvad der menes med desværre.
> Hvis man vil have den streng der indsættes anderledes end eksakt, kan
> man jo bruge strtolower() eller strtoupper() på den først...

Ikke helt.
Lad os antage at jeg har søgt på ordet "jeg" og får den tekst frem som
jeg citerer i dette indlæg.

Den vil ikke fange "jeg", da du har skrevet "Jeg".
Jeg kan heller ikke bruge strtolower, for jeg vil jo gerne bevare det
store 'J' i lige den sætning.

Resultatet er at "Jeg" bliver ignoreret helt (selv om det kommer frem i
søgningen), mens "jeg" går fint. Omvendt hvis jeg havde søgt på "Jeg".


--
Philip - http://chartbase.dk | http://www.hitsurf.dk

Bertel Lund Hansen (29-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 29-09-09 23:32

Vagn Kofoed skrev:

> Er det så str_replace() uden i for ignore case?

Der er mange måder at lave tingene på. Hvis du nærlæser den kode
jeg sendte senere, vil du se at jeg bruger str_replace(), men det
gør jeg først efter at jeg har klippet stumpen ud af den fundne
linje så jeg kan bevare store og små bogstaver.

Princippet kort:

1. Find positionen af den søgte streng - uden hensyn til
store/små bogstaver.

2. Tag et udsnit nogle tegn før og efter den fundne streng.

2. Klip en stump ud af udsnittet fra find-positionen og frem,
præcis så langt som den søgte streng.

3. Brug str_replace() så stumpen omkranses af <span> med den
rigtige klasse.

4. Vis det ændrede udsnit.

5. Gentag til der ikke er flere eksemplarer af søgestrengen.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Vagn Kofoed (30-09-2009)
Kommentar
Fra : Vagn Kofoed


Dato : 30-09-09 01:20

Bertel Lund Hansen wrote in
dk.edb.internet.webdesign.serverside.php:
>
> Der er mange måder at lave tingene på. Hvis du nærlæser den kode
> jeg sendte senere, vil du se at jeg bruger str_replace(), men det
> gør jeg først efter at jeg har klippet stumpen ud af den fundne
> linje så jeg kan bevare store og små bogstaver.
>
Jeg gik skam din kodestump igennem og fandt osse ud af at når min
daglige search/replace skal sofistikeres, bliver der klippet. Hermed
på forhånd tak!

Når jeg blandede mig var det mere for at holde mig på quick-'n-dirty
planet.

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Arne Feldborg (28-10-2009)
Kommentar
Fra : Arne Feldborg


Dato : 28-10-09 16:29

"Martin" <post@teknit.dk> skrev Fri, 25 Sep 2009 19:53:37 +0200


>Hvordan får man "indhegnet" søgeordene fra søgefeltet med et <span class>?
>
Lige en udvidelse af Martins oprindelige spørgsmål.

Uanset hvilken af de forskellige forslag man vælger har de det
tilfælles, at hvis man bruger wildcards bliver hverken søgetermerne
eller det / de fundne ord markeret.

Findes der en nem måde at løse det problem på.?

Martin (30-10-2009)
Kommentar
Fra : Martin


Dato : 30-10-09 14:34

Arne Feldborg wrote:
> "Martin" <post@teknit.dk> skrev Fri, 25 Sep 2009 19:53:37 +0200
>
>
>> Hvordan får man "indhegnet" søgeordene fra søgefeltet med et <span class>?
>>
> Lige en udvidelse af Martins oprindelige spørgsmål.
>
> Uanset hvilken af de forskellige forslag man vælger har de det
> tilfælles, at hvis man bruger wildcards bliver hverken søgetermerne
> eller det / de fundne ord markeret.
>
> Findes der en nem måde at løse det problem på.?

$searchterm = 'søgeord';
// Skal nok lige have nogle str_replaces ind

echo preg_replace('/' . ($searchterm) . '/s', '<span
class="search">$1</span>', $text);

Fx...

Bertel Lund Hansen (30-10-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 30-10-09 15:57

Martin skrev:

> > Uanset hvilken af de forskellige forslag man vælger har de det
> > tilfælles, at hvis man bruger wildcards bliver hverken søgetermerne
> > eller det / de fundne ord markeret.

> > Findes der en nem måde at løse det problem på.?

> $searchterm = 'søgeord';
> // Skal nok lige have nogle str_replaces ind

> echo preg_replace('/' . ($searchterm) . '/s', '<span
> class="search">$1</span>', $text);

Det løser ikke problemet.

   $searchterm = 'heste*';

Hvad vil du stille op med det når der returneres 95 linjer med
forskellige træffere?

Den nemme løsning er selvfølgelig at nøjes med at fremhæve
"heste".

--
Bertel
Jeg har fået ny offentlig mailadresse.

Arne Feldborg (30-10-2009)
Kommentar
Fra : Arne Feldborg


Dato : 30-10-09 19:11

Bertel Lund Hansen <splitteminebramsejl@lundhansen.dk> skrev Fri, 30 Oct
2009 15:57:12 +0100


>> echo preg_replace('/' . ($searchterm) . '/s', '<span
>> class="search">$1</span>', $text);
>
>Det løser ikke problemet.
>
Jeg er enig i, at det Martins eksempel (der vel bygger på Jonathans
oprindelige forslag) ikke virker. Men borstet fra det, så er Jonathans
forslag nok det bedste af dem der hidtil er kommer frem

>Hvad vil du stille op med det når der returneres 95 linjer med
>forskellige træffere?
>
Det blir der ikke.

Nu skal det jo selvfølgelig kunne indgå i mange forskellige sammenhænge.
Men en søgning på Peder i en given sammenhæng kunne feks. se sådan her
ud:
http://80.62.84.41/haunstrup/vis_data_reg.php

Det jeg har brug for et, at kunne opnå en tilsvarende effekt med feks.
søgestrengen: "pe_er%and%"


>Den nemme løsning er selvfølgelig at nøjes med at fremhæve
>"heste".
>
Ja, hvis der kun er eet søgeord, og kun et wildcard i slutningen af
ordet, er det jo ingen sag.

Men selvfølgelig kan man opløse søgestrengen i de enkelte fraser og så
håndtere dem hver for sig.
Spørgsmålet var bare, om der er en nememre måde.


Martin Larsen (10-11-2009)
Kommentar
Fra : Martin Larsen


Dato : 10-11-09 13:50

Arne Feldborg wrote:

> Det jeg har brug for et, at kunne opnå en tilsvarende effekt med feks.
> søgestrengen: "pe_er%and%"

> selvfølgelig kan man opløse søgestrengen i de enkelte fraser og så
> håndtere dem hver for sig.

> Spørgsmålet var bare, om der er en nememre måde.

Det er der!

Dette skulle kunne klare både wildcards og problemet med evt. flere
resultater i samme streng der skal fremhæves. Det er også en løsning til
den oprindelige spørgers problem.


$search = "je_s%sen";
$result = "Jens Chr. K. Andersen, Stationsvej 7, Århus";

$span0 = "<span class='rod'>";
$span1 = "</span>";

$regex = str_replace(array('_', '%'), array('.?', '.*'),
preg_quote($search));

$displaystring = preg_replace("|$regex|i", "$span0\$0$span1", $result);
echo $displaystring;


Jeg har taget udgangspunkt i mysql-wildscards fordi du bruger dem som
eksempel, dvs. _ = ét vilkårligt tegn, og % = nul eller flere vilkårlige
tegn. For almindelige mennesker (slutbrugere) ville det måske være
nemmere at forstå, hvis ? simpelthen betød "hvad som helst", dvs. nul
eller flere vilkårlige tegn, sådan at "jens?andersen" matcher "Jens
Peter Andersen" osv.

Denne alternative wildcard-løsning kan implementeres ved at ændre linje
5 til:

$regex = str_replace('\?', '.*', preg_quote($search));

Hilsen
Martin

Arne Feldborg (10-11-2009)
Kommentar
Fra : Arne Feldborg


Dato : 10-11-09 17:46

Martin Larsen <martin+spamfree+larsen@bigfoot.com> skrev Tue, 10 Nov
2009 13:49:45 +0100

>Dette skulle kunne klare både wildcards og problemet med evt. flere
>resultater i samme streng der skal fremhæves. Det er også en løsning til
> den oprindelige spørgers problem.
>
Mange tak for forslaget, det løser problemet hvis der kun bruges "_".

Men ved brug af "%" vil det, hvis der er flere forekomster, markere alle
de mellemliggende ord også. Men det er nok vanskeligt at undgå.

Jeg tænkte sådan set mere på, om det var muligt kun at markere selve
søgefraserne.

>tegn. For almindelige mennesker (slutbrugere) ville det måske være
>nemmere at forstå, hvis ? simpelthen betød "hvad som helst", dvs. nul
>
Tak for det forslag også, det altid kan være rart at have i baghånden.

Men hvis folk er vant til at søge i sql-databaser (og det er feks. meget
brugt indenfor slægtsforskning) så er de også godt kendt med brugen af
wildcards. Og så vil en generel brug af "%" eller "?" i stedet for "_"
give et altfor upræcist resultat.


Martin Larsen (10-11-2009)
Kommentar
Fra : Martin Larsen


Dato : 10-11-09 19:11

Arne Feldborg wrote:

> Men ved brug af "%" vil det, hvis der er flere forekomster, markere alle
> de mellemliggende ord også. Men det er nok vanskeligt at undgå.

Nej, det er såmænd let nok

Så skal du bare i linje 5 ændre '.*' til '.*?'

Derved blev det regulære udtryk "lazy" i stedet for "greedy".

Fx vil "Peter.*Jensen" matche hele strengen "Peter Kurt Jensen og Morten
Jensen", mens "Peter.*?Jensen" kun matcher "Peter Kurt Jensen".

> Jeg tænkte sådan set mere på, om det var muligt kun at markere selve
> søgefraserne.

Er så ikke helt klar over hvad du mener. Mit forslag markerer netop
søgefraserne.

> Men hvis folk er vant til at søge i sql-databaser (og det er feks. meget
> brugt indenfor slægtsforskning) så er de også godt kendt med brugen af
> wildcards.

Ok. Så er det jo fint nok.

Hilsen
Martin

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste