Avatar billede asgrone Nybegynder
11. januar 2006 - 13:36 Der er 11 kommentarer og
1 løsning

matche en text string med ord fra databasen

Hej
Jeg skal bruge en funktion som tjekker printet fra noget tekst fra databasen, med ord fra en anden tabel fra databasen, og hvis noget matcher lave et link ud af ordet.
Et eksempel kunne være hvis der i brødteksten fra en nyhed optræder navnet "Aphex Twin", og der eksisterer en række i "kunstner tabellen" som hedder Aphex Twin. I så flad skal ordet Aphex Twin i nyheden linke til en side som indeholder de informationer databasen rummer omkring Aphex Twin.

Er det noget sam kan lade sig gøre?
Avatar billede jakobdo Ekspert
11. januar 2006 - 13:57 #1
str_replace() burde kunne hjælpe dig!
Avatar billede rednex Nybegynder
11. januar 2006 - 14:55 #2
Noget i denne stil burde kunne bruges:

$search = $replace = array();

$res = mysql_query('SELECT id, navn FROM kunstere WHERE 1=1');
while ($row = mysql_fetch_assoc($res)) {
    $search[] = $row['navn'];
    $replace[] = '<a href="side.php?id=' . $row['id'] . '">' . $row['navn'] . '</a>';
}

$nyhed = str_replace($search, $replace, $nyhed);
Avatar billede asgrone Nybegynder
11. januar 2006 - 15:15 #3
jeg kendte egentlig godt str_replace, men havde slet ikke tænkt på at man kan så meget med den. Hvor moget går det egentlig ud over hastigheden, hvis man skal gøre sådan et tjek på f.eks. brødteksten til 10 nyheder?
Avatar billede jakobdo Ekspert
11. januar 2006 - 15:22 #4
Ikke noget du vil bemærke!
Avatar billede rednex Nybegynder
11. januar 2006 - 15:24 #5
Det kommer selvfølgelig an på hvor stor din brødtekst er, og hvor mange kunstere du leder efter. Du kan jo prøve at måle hvor lang tid det tager:

function getmicrotime(){
    list($msec, $sec) = explode(" ",microtime());
    return ((float)$msec + (float)$sec);
}

$start = getmicrotime();
// Søg og erstat
echo 'Søg/erstat tog ' . number_format(getmicrotime() - $start, 3) . ' sekunder';
Avatar billede asgrone Nybegynder
11. januar 2006 - 16:21 #6
jeg fik dit eksempel til at virke rednex, men jeg har lige et hurtigt spørgsmål:
Kan man lave den så den ikke er case sensitiv, hvis man nu skulle glemme et stort bogstav?
Avatar billede jakobdo Ekspert
11. januar 2006 - 16:25 #7
Hvis du har php5: str_ireplace()
Avatar billede rednex Nybegynder
11. januar 2006 - 16:45 #8
Desværre findes der ikke en case-insensitive version af str_replace() til PHP4. I stedet kan man bruge preg_replace(), men så skal der lige et par linier:

$search[] = $row['navn']; og
$nyhed = str_replace($search, $replace, $nyhed);
ændres til hhv.
$search[] = '/' . preg_quote($row['navn']) . '/i'; og
$nyhed = preg_replace($search, $replace, $nyhed);
Avatar billede asgrone Nybegynder
11. januar 2006 - 16:50 #9
Heldigvis havde jeg php5 på min webserver, så det hele virker som det skal nu. Mangetak for hjælpen begge to. Jeg slet ikke troet det ville være så let!
Skriv et svar rednex.
Avatar billede rednex Nybegynder
11. januar 2006 - 16:57 #10
Det var så lidt :o)

Jeg turde ikke satse på at du havde PHP5 (det er de færreste som har det), så du fik PHP4 versionen i stedet. Det var nu også på tide at de fik lavet en case-insensitive version af str_replace().
Avatar billede asgrone Nybegynder
11. januar 2006 - 18:12 #11
lige en lille ting her på falderebet:
Det virker til at output'et stopper hvis der optræder et komma i tekststrengen, kan det passe? hvad kan jeg i så fald stille op?
Avatar billede rednex Nybegynder
11. januar 2006 - 18:56 #12
Hmm, det lyder godt nok mærkeligt. Bruger du str_ireplace() eller preg_replace()?

Når du nu kører PHP5 vil jeg anbefale at du bruger str_ireplace(). Så burde det ikke kunne gå galt.
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