Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

markere ord fra søgning

0 views
Skip to first unread message

Martin

unread,
Sep 25, 2009, 1:53:37 PM9/25/09
to
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

unread,
Sep 25, 2009, 3:49:14 PM9/25/09
to
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

unread,
Sep 25, 2009, 6:27:16 PM9/25/09
to
Respekt - det m� jeg sige - fungerer bare s� fint, Tak for det :-)

Hilsen Martin


"Bertel Lund Hansen" <unos...@lundhansen.dk> skrev i en meddelelse
news:j57qb5dp1cumk82h3...@news.stofanet.dk...

Philip Nunnegaard

unread,
Sep 26, 2009, 2:04:49 AM9/26/09
to
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

unread,
Sep 26, 2009, 3:55:58 AM9/26/09
to
Philip Nunnegaard <nunne...@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

unread,
Sep 27, 2009, 5:44:08 PM9/27/09
to
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

unread,
Sep 27, 2009, 7:21:06 PM9/27/09
to
Jonathan Stein <jst...@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

unread,
Sep 29, 2009, 10:06:45 AM9/29/09
to
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 <nunne...@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

unread,
Sep 29, 2009, 10:35:58 AM9/29/09
to
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 Lund Hansen

unread,
Sep 29, 2009, 11:47:50 AM9/29/09
to
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;
}
}
?>

Vagn Kofoed

unread,
Sep 29, 2009, 1:53:07 PM9/29/09
to
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

Philip Nunnegaard

unread,
Sep 29, 2009, 2:29:29 PM9/29/09
to
Vagn Kofoed skrev:

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

Den ignorerer desv�rre heller ikke store og sm� bogstaver.

Bertel Lund Hansen

unread,
Sep 29, 2009, 6:31:30 PM9/29/09
to
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.

Vagn Kofoed

unread,
Sep 29, 2009, 8:20:10 PM9/29/09
to
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.

Birger Sørensen

unread,
Sep 29, 2009, 8:42:52 PM9/29/09
to
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

unread,
Sep 30, 2009, 1:13:12 AM9/30/09
to
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".

Arne Feldborg

unread,
Oct 28, 2009, 11:29:24 AM10/28/09
to
"Martin" <po...@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

unread,
Oct 30, 2009, 9:34:00 AM10/30/09
to

$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

unread,
Oct 30, 2009, 10:57:12 AM10/30/09
to
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

unread,
Oct 30, 2009, 2:10:54 PM10/30/09
to
Bertel Lund Hansen <splittemi...@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

unread,
Nov 10, 2009, 7:49:45 AM11/10/09
to
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

unread,
Nov 10, 2009, 11:45:52 AM11/10/09
to
Martin Larsen <martin+spam...@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

unread,
Nov 10, 2009, 1:11:07 PM11/10/09
to
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

0 new messages