30. april 2010 - 13:19
Der er
1 løsning
Erstatte tekst mellem nested parenteser
Hej.
Jeg skal kunne replace alle forekomster af tekst mellem nested parenteser.
input kunne være noget lign: "foo(bar)(xxx(yyy))"
output skal så være "foo(BAR)(XXX(YYY))"
pt har jeg noget lign: /\([a-zA-Z0-9 ]*\)/, men den matcher kun "(bar)", selvfølgelig.
Nogen foreslag til hvilke teknikker eller lign jeg skal kigge på?
30. april 2010 - 14:32
#1
Fandt ud af at det ikke kunne løses med regexp.. så det er blevet gjort sådan her istedet:
$o = $s = "(id=1 OR id=2)&((postal=[])|(postal=1234))";
$match_data = "";
$match_start = -1;
$pos = 0;
do
{
$c = $s{$pos};
if(preg_match("/[\(\)\&\|]/", $c))
{
if(strlen($match_data))
{
$match_length = strlen($match_data);
$replace = strtoupper($match_data);
$s = substr_replace($s, $replace, $match_start, $match_length);
$pos = $pos + (strlen($replace) - $match_length)+1;
}
$match_start = $pos+1;
$match_data = "";
}
else
{
if($match_start >= 0)
{
$match_data .= $c;
}
}
/* Increase pos */
$pos++;
} while(strlen($c));
print $o."<br />";
print $s;