Ik post hier zelden en nu toch alweer een vraag, zou me bijna schamen maar waag het er toch op. De laatste jaren ben ik bezig met het schrijven van een weersvoorspellingswedstrijd, en inmiddels ben ik daarbij aangekomen aan versie 3. In deze versie heb ik gebruik gemaakt van een veld om een zoekterm in te geven en deze geeft dan alle regels terug die hieraan voldoen. Gezocht wordt in het veld met "naam (woonplaats)" waarbij ik moeiteloos kan zoeken op naam of woonplaats, het gebruik van () is geen probleem en ook kleine of hoofdletters werkt prima. Wanneer ik echter een volledige term intik, bijv: Sjoerd (Leiden)
dan wordt er niets getoont, terwijl ik onder die naam in het systeem sta. Ik heb inmiddels de nodige uren besteed aan het zoeken op internet en het testen van allerlei combinaties, maar kan geen oplossing vinden die werkt.
De bewuste deel van de code is alsvolgt:

if ($zoek != "") {
$teller=0;
while (list($key, $val) = each($inhoud_2)) {
if (preg_match("/^$zoek|.$zoek/i", $inhoud_2[$key])) {

Ik heb geprobeerd aan het eind nog "s" toe te voegen, maar dit levert niets op. De site waar het omgaat is de volgende:

http://sjoerd.rosdorff.dyndns.org/weerpoll_v3

Klik dan op "Controleer deelname" om de bewuste situatie te zien.
Zou iemand mij uit de brand kunnen helpen?
weet je zeker dat ie de variabelen pakt? ik denk dat je ze beter buiten quotes kan zetten. tenslotte word $ ook gebruikt om in een regex pattern een einde aan te geven.
Ja de variable $zoek (hierin zit de ingetikte zoekterm) wordt gepakt.
Zoals al beschreven in de topic-starter werkt alles naar behoren, behalve wanneer de volledige term ingevoerd wordt, dan komt de match niet tot stand.
de regex patter zou ik als: "/^.?" . $zoek . "/i" schrijven..
ipv die while zou ik een foreach gebruiken al maakt t verder geen verschil..

verder zie ik der zo geen fout in..

heb je error reporting aan staan?
Het probleem zit hem in de haakjes die je in je zoek string hebt staan. ( en ) zijn speciale tekens in een regex en als je die letterlijk wilt matchen zul je ze moeten escapen. Daarnaast moet je zoals CrawlBackwards al zegt de variabele altijd buiten quotes halen.

<?php
$string = 'Sjoerd (Leiden)';
$zoek = 'Sjoerd \(Leiden\)';

$check = preg_match('/^'.$zoek.'$/i', $string);
echo $check ? 'true' : 'false'; // true
?>
Dank voor het meedenken Blanche, maar de door jou gegeven oplossing heeft als effect dat er geen enkele match meer tot stand komt. Voorheen als ik bijv. S intikte, kreeg ik alles terug met een S er in. Nu kan ik intikken wat ik wil, maar er komt geen enkele match uit.

oude code: if (preg_match("/^$zoek|.$zoek/i", $inhoud_2[$key])) {

code nieuw: if (preg_match('/^'.$zoek.'$/i', $inhoud_2[$key])) {
Mijn code is niet meer dan alleen een voorbeeldje, het is natuurlijk niet direct toepasbaar. Ik geef je nu alleen aan waar het probleem zit, hoe je dat oplost is aan jou.

Heb je daar hulp bij nodig, dan zul je wat meer van je script moeten laten zien, bijvoorbeeld hoe je aan $zoek en $inhoud_2 komt.
Okee, dan had ik dat verkeerd begrepen.
Inmiddels heb ik het opgelost door de ( en ) te escapen.

if ($zoek != "") {
$zoek=str_replace("(","\(",$zoek);
$zoek=str_replace(")","\)",$zoek);

Nu werken en de losse letters, alleen de naam of alleen de woonplaats en wanneer de volledige naam (woonplaats) wordt ingegeven, wordt deze ook terug gegeven. Probleem opgelost dus :-)
Dank voor het meedenken allemaal.

Reageren