preg_match code opzoeken in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Enrico -

Enrico -

12/03/2013 15:30:05
Quote Anchor link
ik probeer een script te maken dat een code in de tekst, die tussen [c] en [/c] staat, omzet naar een prijs, die in de database staat.

Tot nu toe heb ik dit

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
<?php
include('dbconnect.php');
$tekst = 'dit kost [c]dv1[/c]';

preg_match_all('/\[c\](.*?)\[\/c\]/Usi', $tekst, $matches);

if(!empty($matches[1])){
    foreach($matches[1] as $o => $code){
        $query = mysql_query("SELECT * FROM codes WHERE code = '". $matches. "' LIMIT 1");
        if($row = mysql_fetch_array($query)){
            $tekst = str_replace($matches[0][$o], $row['price'], $tekst);
        }
    }
}

echo $tekst;
?>


maar daarmee zet hij de code niet om in de prijs, maar echoed hij "dit kost [c]dv1 [/c]. Waar denk ik verkeerd?
Gewijzigd op 12/03/2013 15:42:39 door Enrico -
 
PHP hulp

PHP hulp

21/12/2024 09:23:50
 
Willem vp

Willem vp

16/03/2013 19:41:34
Quote Anchor link
Er zitten twee problemen in je code.

1) De reden dat $tekst niet wordt veranderd, is omdat je in regel 9 de verkeerde variabele gebruikt: $matches in plaats van $code.

2) Deze is subtiel, maar gaat je een heleboel problemen opleveren. Het betreft je reguliere expressie. Die luidt nu:

/\[c\](.*?)\[\/c\]/Usi

Je gebruikt daarin een *? lazy quantifier, maar je gebruikt ook de modifier U die ervoor zorgt dat de greedyness wordt omgekeerd. Oftewel, je maakt de * juist greedy in plaats van lazy. In het codefragment dat je hebt gepost gaat het goed, maar je krijgt problemen als je bijvoorbeeld als input-string hebt:

$tekst = 'dit kost [c]dv1[/c] en iets anders kost [c]dv2[/c].';

In plaats van twee matches ('dv1' en 'dv2') krijg je dan 1 match 'dv1[/c] en iets anders kost [c]dv2'. Niet wat je wilt.

Oplossing: schrap de U. Je krijgt dan de regex /\[c\](.*?)\[\/c\]/si die wél doet wat je wilt.

(In principe zou je ook de ? kunnen weghalen en de U laten staan, maar dat heeft niet mijn voorkeur, omdat U geen standaard regex modifier is.)
Gewijzigd op 16/03/2013 19:42:41 door Willem vp
 
Enrico -

Enrico -

16/03/2013 21:14:15
Quote Anchor link
Mijn dank is heel groot.
 



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.