deel uit tekstveld weergeven

Status
Niet open voor verdere reacties.

mariannevanh

Terugkerende gebruiker
Lid geworden
14 dec 2004
Berichten
2.135
Ik heb een database met een groot aantal liederen.
Een van de velden (veldnaam: tekst) is van het type Text en bevat de tekst van (alle coupletten van) het lied.
Door middel van een script kan men zoeken in de database naar woorden die in een lied voorkomen.

Een aantal liederen is dermate groot dat het niet wenselijk is de volledige tekst van het lied weer te geven bij de zoekresultaten (dat kan altijd nog bij een nadere selectie). Bij voorkeur zou het script de regel moeten weergeven waarin het gezochte woord voorkomt (plus evt. de voorgaande en volgende regel).
Is dat mogelijk?
Hierbij een stukje code:
Code:
echo '<table><tr><td><b>Resultaten</b></td></td>';
while($row = mysql_fetch_array($result)) {
echo '<tr><td>'. $row['bundel1'] .'</td><td>'. $row['nr1'] .'</td><td>'. $row['subnr1'] .'</td><td>'. $row['vers1'] .'</td><td>'. $row['bundel2'] .'</td><td>'. $row['nr2'] .'</td><td>'. $row['subnr2'] .'</td><td>'. $row['vers2'] .'</td><td>'. $row['tekst'] .'</td>';
Een kort voorbeeld:
Wanneer het Wilhelmus met z'n 15 coupletten in de database voorkomt (en de tekst van die 15 coupletten staat dus integraal in het veld Tekst) en ik zoek naar het woord "betrouwen", dan wil ik eigenlijk alleen de regel "Mijn schild ende betrouwen" zien.

Wie kan mij helpen?
 
Bedoel je zoiets?
PHP:
<?php

function zoek($s_tekst, $s_woord) {
  $a_tekst = explode("\n", $s_tekst);
  foreach($a_tekst AS $i_key => $s_value) {
    if(strpos($s_value, $s_woord) !== FALSE) {
      return $a_tekst[$i_key];
    }
  }
  return 'Zoekterm niet gevonden';
}

$tekst = 
"Wilhelmus van Nassouwe
ben ik, van Duitsen bloed,
den vaderland getrouwe
blijf ik tot in den dood.
Een Prinse van Oranje
ben ik, vrij, onverveerd,
den Koning van Hispanje
heb ik altijd geëerd.

Mijn schild ende betrouwen
zijt Gij, o God mijn Heer,
op U zo wil ik bouwen,
Verlaat mij nimmermeer.
Dat ik doch vroom mag blijven,
uw dienaar t'aller stond,
de tirannie verdrijven
die mij mijn hart doorwondt.";
$tekst = nl2br($tekst);

$zoek = "betrouwen";


$zoekt = zoek($tekst, $zoek);

echo '
<b>Volledige tekst</b><br />'. $tekst .'<br /><br />
<b>Regel door zoekterm:</b><br />'. $zoekt;
?>
Het is in deze functie echter wel vereist dat er na elke regel een nieuwe regel komt.

edit: Nadeel van bovenstaande functie is dat hij het eerste resultaat alleen weergeeft. Daar heb ik natuurlijk even wat op gevonden...

Je hebt nu ook de mogelijkheid om de zoekterm vetgedrukt weer te geven in de regel, die optie staat standaard uit maar je kunt door een toevoeging aan de functie het aanzetten :)

PHP:
<?php

function zoek($s_tekst, $s_woord, $b_markeer = FALSE) {
  $a_returnArray = array();
  $a_tekst = explode("\n", $s_tekst);
  foreach($a_tekst AS $i_key => $s_value) {
    if(strpos($s_value, $s_woord) !== FALSE) {
      if($b_markeer) {
        $a_returnArray[] = str_replace($s_woord, "<b>". $s_woord ."</b>",$a_tekst[$i_key]);
      } else {
        $a_returnArray[] = $a_tekst[$i_key];
      }
    }
  }
  return $a_returnArray;
}

$tekst = 
"Wilhelmus van Nassouwe
ben ik, van Duitsen bloed,
den vaderland getrouwe
blijf ik tot in den dood.
Een Prinse van Oranje
ben ik, vrij, onverveerd,
den Koning van Hispanje
heb ik altijd geëerd.

Mijn schild ende betrouwen
zijt Gij, o God mijn Heer,
op U zo wil ik bouwen,
Verlaat mij nimmermeer.
Dat ik doch vroom mag blijven,
uw dienaar t'aller stond,
de tirannie verdrijven
die mij mijn hart doorwondt.";
$tekst = nl2br($tekst);

$zoek = "anje";

$zoekt = zoek($tekst, $zoek, TRUE);
//Door aan het einde TRUE te zetten wordt het vetdrukken ingeschakeld.
//Wil je het niet dan laat je het gewoon weg, de functie wordt dan
// $zoekt = zoek($tekst, $zoek);

echo '
<b>Volledige tekst</b><br />'. $tekst .'<br /><br />
<b>Regel door zoekterm:</b><br />';
foreach($zoekt AS $regel) {
  echo $regel;
}
?>
Deze functie geeft nu als een resultaat een array, die moet je dus ook zo uitlezen.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan