Links in tekst zoeken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robin

Robin

30/11/2006 10:44:00
Quote Anchor link
Ik heb een vraagje m.b.t. mijn website Wereld van Oranje. Ik heb een database met nieuwsberichten én een database met gegevens over sporters.
In die berichten gebruik ik bijvoorbeeld de naam Piet Jansen en dan wil ik dat als ik die tekst typ, dit automatisch een link wordt naar het profiel van Piet Jansen. Is dit mogelijk en zo ja, hoe kan ik dit het makkelijkst aanpakken? Zo niet, op welke manier kan dit wél redelijk eenvoudig, zonder iedere keer <a href=huppeldepup...> in te hoeven tikken voor een naam?

Alvast bedankt voor de hulp!
 
PHP hulp

PHP hulp

19/11/2024 04:33:54
 
Martijn B

Martijn B

30/11/2006 10:52:00
Quote Anchor link
Je zou zo iets kunnen doen ik je tekst:

[profiel]Piet Jansen[/profiel]


En dan met een regex het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

$tekst
= preg_replace('/\[[ ]*profiel[ ]*\](.+?)\[[ ]*\/[ ]*profiel[ ]*\]/i', '<a href="$1">$1</a>', $tekst);

?>


edit:

Niet getest!
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Robin

Robin

30/11/2006 11:03:00
Quote Anchor link
Oké, die snap ik niet helemaal, maar daar zal ik vanmiddag eens even naar kijken...

De DB met sportersgegevens is als volgt opgebouwd: voornaam, tussenvoegsel, achternaam. Dus op het moment dat ik bijv. Piet de Vries intik, moet ie zowel op voor, tussen als achternaam zoeken.

Dus als ik het goed begrijp, tik ik dan [profiel]Piet de Vries[/profiel] en dan vervangt de regel die je tikte het door de link naar profiel.php?id= etc. Tenminste, als ik dat natuurlijk correct aangeef...
 
Martijn B

Martijn B

30/11/2006 11:07:00
Quote Anchor link
[profiel]Piet Jansen[/profiel]

wordt:

<a href="Piet Jansen">Piet Jansen</a>


Alleen moet je dan een manier gezinnen om uniek op "Piet Jansen" te kunnen zoeken. Voor het weergeven van het profiel.

Een andere mogelijkheid is om, dit te doen:

[profiel=123]Piet Jansen[/profiel]

Waar 123 dus het id is van Piet Jansen. Maar dan kun je dus net zo goed een linkje maken ;D

Edit:

In het tweede geval wordt het dus:

<a href="profiel.php?id=123">Piet Jansen</a>
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Robin

Robin

30/11/2006 11:22:00
Quote Anchor link
Mjah, dat laatste is geen goed idee, dat schiet niet op.

Ik zou natuurlijk een kolom 'complete naam' in de DB kunnen invoeren, of kunnen zoeken op 'voornaam+tussen+achternaam', dus daar ga ik eens even naar kijken...
 
Frank -

Frank -

30/11/2006 12:13:00
Quote Anchor link
Wanneer jij een lap tekst invoert, hoe moet jouw query nu weten wat nu precies de naam is? Voorbeeldje: "De fiets die vorige week aan Jan de Vries is verkocht, is deze week gestolen."

Jij en ik herkennen 'Jan de Vries' als een naam, zelfs als er geen hoofdletters worden gebruikt, maar voor jouw script is 'Jan de Vries' hetzelfde als 'is deze week'. Tuurlijk, er worden andere karakters gebruikt, maar het blijft tekst die voor jouw script geen enkele betekenis heeft. Jij kent er een betekenis aan toe, bv. dat een stukje tekst een naam is.

Wanneer jij niet weet of een naam in de database staat en welk id deze heeft, gebruik dan in elk geval een tag om aan jouw script te vertellen wat nu de naam is waarop moet worden gezocht. Bv. "De fiets die vorige week aan [naam]Jan de Vries[/naam] is verkocht, is deze week gestolen."

Wanneer deze naam dan in de database staat, kun je met een regex een link maken, is de naam niet bekend, dan doe je er niets mee. De tags toon je uiteraard niet.

Tip: De regex om een hyperlink te maken en de query om de boel te matchen, voer je uit wanneer de tekst wordt opgehaald uit de database om te worden getoond op het scherm. Doe dit vooral niet bij het invoeren of updaten, dit gaat problemen opleveren wanneer namen worden verwijderd of toegevoegd.
 
Robin

Robin

30/11/2006 13:11:00
Quote Anchor link
Frank schreef op 30.11.2006 12:13:
Wanneer jij een lap tekst invoert, hoe moet jouw query nu weten wat nu precies de naam is? Voorbeeldje: "De fiets die vorige week aan Jan de Vries is verkocht, is deze week gestolen."


Er staat niet voor niets 'newbie' onder mijn naam :-P Maar inderdaad, dat ben ik met je eens!

Hoe kan ik het best beginnen om dit te doen? Met bepalen van zoekvoorwaarde, dus de naam waarop gezocht moet worden. Heb ik de DB ook een kolom 'sportnaam', bijv. De Vries, staan, of is het mogelijk op voornaam+tussenvoegsel+achternaam te zoeken?
Gewijzigd op 01/01/1970 01:00:00 door Robin
 
Jan Koehoorn

Jan Koehoorn

30/11/2006 14:21:00
Quote Anchor link
Uiteraard. Als je drie van die velden in je DB hebt. Een query ziet er dan bijvoorbeeld zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
    voornaam, tussenvoegsel, achternaam
FROM
    tabelnaam
WHERE
    voornaam LIKE '%zoekwoord%'
OR
    tussenvoegsel LIKE '%zoekwoord%'
OR
    achternaam LIKE '%zoekwoord%'
 
Robin

Robin

30/11/2006 16:18:00
Quote Anchor link
Ja, oké. Dat klopt. Maar wat te doen met 'van de' etc. etc. Want dan heb je voornaam (Piet)-tussen (de)-achternaam (Vries), dat lukt nog wel. Maar als je dan ook nog voornaam (Piet)-tussen (van)-tussen (de)-achternaam (Vries)... Dus ik gok dat het toch maar gewoon een kolommetje 'complete naam' moet worden...
 
Joren de Wit

Joren de Wit

30/11/2006 16:30:00
Quote Anchor link
'van de' wordt dan toch gewoon als 1 tussenvoegsel gezien. Het is niet zo dat je 2 losse tussenvoegsels in 1 naam hebt.

Piet de Vries (tussenvoegsel = 'de')
Jan van Leeuwen (tussenvoegsel = 'van')
Peter van der Meer (tussenvoegel = 'van der')

Er is toch geen probleem mee om een tussenvoegsel bestaande uit meerdere woorden in een kolom op te slaan?
 
Frank -

Frank -

30/11/2006 16:32:00
Quote Anchor link
Volgens mij is het niet nodig om een kolom 'complete_naam' aan te maken. Je kunt in de query de kolomnamen met CONCAT() aan elkaar plakken. Het lijkt mij dat je daar ook op kunt vergelijken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
  id
FROM
  tabelnaam
WHERE
  CONCAT(voornaam, ' ', tussenvoegsel, ' ', achternaam) = 'Piet de Vries'
OR
  CONCAT(voornaam, ' ', achternaam) = 'Piet Vries'

Hou even de extra spaties en tussenvoegsel in de gaten. Ik denk dat je nog beter met php kunt bepalen uit hoeveel woorden de naam bestaat en dan altijd het eerste woord als voornaam gebruiken en het laatste als achternaam. De rest gebruik je dan als tussenvoegsel. Op basis van dit resultaat stel je dan in php de WHERE-clausule samen, dus mét of zónder de vergelijking op tussenvoegsel. Dat is fraaier dan een OR in de WHERE.
 
Robin

Robin

30/11/2006 16:34:00
Quote Anchor link
Nou, ik kom er dus echt niet uit... Helaas.

Ik heb nu een db 'profielen' met daarin een kolom 'naamcompleet'. Stel, Piet de Vries heeft id '1'. Hoe zorg ik er nou voor dat op het moment dat ik in een verhaal '[naam]Piet de Vries[/naam]' tik, dat dat een link wordt naar profiel.php?id=1? Wat moet ik waar in m'n php-bestand zetten om dit te krijgen?

En even een subvraagje, maar dat is een latere zorg: stel ik heb twee keer een Piet de Vries in de db staan... Dát is een probleem, denk ik zo...
 
Frank -

Frank -

30/11/2006 17:34:00
Quote Anchor link
Hier een stukje code waarmee je de queries kunt opstellen. Je kunt inderdaad meerdere id's krijgen, in dat geval zul je eerst naar een landingspage moeten gaan en daar de bezoeker een keuze laten maken tussen de verschillende mogelijkheden.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$tekst
= '[naam]Henk[/naam]. Dit is de naam [naam]Piet Janssen[/naam] die in een regel tekst staat, net zoals [naam]Jan Peters[/naam].';

$aText = preg_split('[\[naam\]|\[\/naam\]]', $tekst);

print_r($aText); // Array met alle stukken tekst, de oneven keys zijn de namen.

$aNamen = array();
foreach ($aText as $key => $naam){
    if (($key % 2) == 1) { // oneven
        $aNamen[] = $naam;
    }
}

print_r($aNamen); // even ter verduidelijking

foreach ($aNamen as $sNaam) {
    $count = count(explode(' ', $sNaam));

    switch ($count){
        case
1: // de naam kan zowel de voor- als achternaam zijn
            $qWhere = "voornaam = '".$sNaam."' OR achternaam = '".$sNaam."'";
            break;
        case
2: // voor- en achternaam
            $qWhere = "CONCAT(voornaam, ' ', achternaam) = '".$sNaam."'";
            break;
        default:

            $qWhere = "CONCAT(voornaam, ' ', tussenvoegsel, ' ', achternaam) = '".$sNaam."'";
    }

    $query = "SELECT id FROM tabelnaam WHERE ".$qWhere.PHP_EOL;
    echo $query; // uitvoeren query en iets met de id's gaan doen.
}
?>

De rest mag je zelf gaan uitvogelen.

Wellicht zijn er betere oplossingen, maar dit werkt tot zover goed.

Ps. Leuk topic!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.