PHP regex

Pozdravljeni,

naletel sem na problem, ki mi rahlo greni življenje in mislim, da bi ga kdo tukaj brez večjega problema rešil.

// prvi
$ref = preg_match_all( "{\[ref\](.*)\[\/ref\]}i", $txt, $ret );

// drugi
$ref = preg_match_all( "{\[ref\]([^\[\/ref\]]*.*)\[\/ref\]}i", $txt, $ret );

Mene zanima vse med tagoma [ref] in [/ref], kar ni problematično, je pa problem če se pojavita dva v istem subjectu ($txt), ker dobim nazaj vse kar je med zunanjima dvema.

Upam da ima kdo minutko časa in volje za pomoč.
Hvala

2 odgovora

Preberi si malo o Pattern Modifiers. Zanima te U (PCRE_UNGREEDY).

btw: drugi regular expression nima smisla, tam si dolocil le to, da takoj za [ref] ne sme biti znakov [, /, r, e, f ali ], vendar, ker si uporabil potem *, ki matcha tudi 0 znakov, je ta del povsem brez veze. Je pa tudi brez veze, ker ni to, kar si zelel doseci :)

$txt = "[ref]REF1[/ref] Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n";
$txt.= "In nec pede a nulla placerat bibendum. [ref]REF2[/ref] Maecenas nec turpis eu diam pretium aliquam.";
$ref = array();
if(preg_match_all("#\[ref\](.*?)\[\/ref\]#i",$txt,$matches,PREG_SET_ORDER)) {
  foreach($matches as $match) {
    $ref[] = $match[1];
  }
}
var_export($ref);

output:

array ( 0 => 'REF1', 1 => 'REF2', )