Probleem met preg_match

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sjoerd Rosdorff

Sjoerd Rosdorff

18/11/2006 23:55:00
Quote Anchor link
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?
 
PHP hulp

PHP hulp

29/03/2024 08:54:45
 
CrawlBackwards

CrawlBackwards

19/11/2006 00:36:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
 
Sjoerd Rosdorff

Sjoerd Rosdorff

19/11/2006 00:41:00
Quote Anchor link
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.
 
CrawlBackwards

CrawlBackwards

19/11/2006 01:45:00
Quote Anchor link
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?
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
 
Joren de Wit

Joren de Wit

19/11/2006 10:28:00
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$string
= 'Sjoerd (Leiden)';
$zoek = 'Sjoerd \(Leiden\)';

$check = preg_match('/^'.$zoek.'$/i', $string);
echo $check ? 'true' : 'false'; // true
?>
 
Sjoerd Rosdorff

Sjoerd Rosdorff

19/11/2006 10:43:00
Quote Anchor link
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])) {
 
Joren de Wit

Joren de Wit

19/11/2006 10:51:00
Quote Anchor link
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.
 
Sjoerd Rosdorff

Sjoerd Rosdorff

19/11/2006 10:59:00
Quote Anchor link
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.
 



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.