[PHP] preg_replace_callback probleem

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hoi

Ik probleer doormiddel van preg_replace_callback bepaalde codes in een tekst om te zetten naar een waarde. Ik krijg de matches goed in mijn callback functie, zolang ik maar 1 code in de string heb... bij 2 op meer gaat het fout:

code:
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
<?php 
$string = "This is uri one {uri_code1} blaat blaat";
$string2 = "This is uri one {uri_code1} and this {uri_code2}";

preg_replace_callback("|\{uri_(.*)\}|","mycallback",$string);
/* OUTPUT IS OK:
Array
(
    [0] => {uri_code1}
    [1] => code1
) */


preg_replace_callback("|\{uri_(.*)\}|","mycallback",$string2);
/* OUTPUT IS NOT OK:
Array
(
    [0] => {uri_code1} and this {uri_code2}
    [1] => code1} and this {uri_code2
) */

function mycallback($matches) {
    print_r($matches);
}
?>

Ik heb me suf gezocht waarom het in het 2e geval fout gaat, maar krijg het niet opgelost, weet iemand raad?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zoekterm: greedy. ;)

{signature}


  • gertjuhh
  • Registratie: April 2004
  • Laatst online: 26-04 09:14

  • ray538
  • Registratie: Januari 2010
  • Laatst online: 19-09 16:34
Je moet inderdaad even zoeken op greedy. Persoonlijk vind ik dit: http://www.regular-expressions.info/reference.html een beter overzicht dan de regex uitleg van php.net.

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Ik grebruik vaak de CheatSheet voor het schrijven van regexp-en.
Plaatje

If money talks then I'm a mime
If time is money then I'm out of time


Verwijderd

Waarom gebruik je .* ? Helemaal nergens voor nodig.

code:
1
'~{uri_code(\d+)}~

Acties:
  • 0 Henk 'm!

  • dwilmer
  • Registratie: Oktober 2008
  • Laatst online: 25-01 09:50
Wat voor mij erg helpt bij het schrijven van regex-en is KiKi, een open-source (d8 ik) regex tester. Laat je precies zien wat er gematcht wordt. Te vinden in de Ubuntu Software Repo, of hier.

Verder is dit inderdaad een greedy probleem: hij probeert zo veel mogelijk te matchen (de regex "{.*}" matcht "{foo}", maar ook "{foo} {bar}").
Pagina: 1