Links in tekst zoeken
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!
[profiel]Piet Jansen[/profiel]
En dan met een regex het volgende doen:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$tekst = preg_replace('/\[[ ]*profiel[ ]*\](.+?)\[[ ]*\/[ ]*profiel[ ]*\]/i', '<a href="$1">$1</a>', $tekst);
?>
$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
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...
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
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...
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.
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
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...
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?
Code (php)
1
2
3
4
5
6
7
8
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'
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.
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...
Code (php)
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
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.
}
?>
$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!