regulärer ausdruck für äußerste tags

roflnub

Mitglied
so, mal wieder ein regex aber diesmal richtig schwer (das glaube ich zumindest mal)
hier ist mein string:
Code:
string {

	foo{
		blub {
			insidetext;
		}
	}
	
	bar {
		asdf {
			insidetext;
		}
	}
	
	qwer {
		insidetext;
	}
}

string2 {
	
	foo {
		insidetext;
	}
	
	check {
		insidetext;
	}
}

man sieht ich habe dadrin 2 so eine art objekte (string, und string2) jetzt will die klammern die diese objekte haben, also die die direkt nach dem eigennamen kommt und die aller letzte die das objekt schließt, ersetzen mit [ bzw. ]. ca so:
Code:
string [

	foo{
		blub {
			insidetext;
		}
	}
	
	bar {
		asdf {
			insidetext;
		}
	}
	
	qwer {
		insidetext;
	}
]

string2 [
	
	foo {
		insidetext;
	}
	
	check {
		insidetext;
	}
]

hoffentlich ist das machbar
 
Hi,

mir fällt kein guter Regulärer Ausdruck dazu ein. Ich bin mir sicher da kommt noch von anderer Stelle was.
Bis dahin habe ich hier eine, so wie es scheint, funktionierende Alternative:
PHP:
$arr = explode("\n",$str); // in $str steht dann der String

$retVal = array();

foreach ($arr as $value) {
	if (!preg_match('/^\t/',$value)) {
		$retVal[] = str_replace(array('{','}'),array('[',']'),$value);
	}
	else {
		$retVal[] = $value;
	}
}
print implode("\n",$retVal);

Testausgabe:
Code:
string [

	foo{
		blub {
			insidetext;
		}
	}
	
	bar {
		asdf {
			insidetext;
		}
	}
	
	qwer {
		insidetext;
	}
]

string2 [
	
	foo {
		insidetext;
	}
	
	check {
		insidetext;
	}
]
 
das funktioniert sehr gut, das problem ist nur dieser string ist nicht immer so schön eingerückt

edit: ich kugg gerade mal ob mir ein regex einfällt mit dem ich das schön einrücken kann, auf jedenfall vielen dank hast mir ein denkanstoß gegeben
 
Zuletzt bearbeitet:
Hi,

wo kommt dieser String eigentlich konkret her? Kann es sein, dass es sich hier um das Ergebnis der Funktion [phpf]serialize[/phpf] handelt?

Und bitte achte in Deinen Beiträgen auf die Rechtschreibung, wie es Punkt 15 unserer Netiquette verlangt. Insbesondere Deine durchgängige Kleinschreibung ist hier nicht erwünscht. Vielen Dank.

LG
 
Ok, werde ich ab jetzt machen.
Nein dieser String ist eine Benutzereingabe und dieser wird womöglich nicht soviel Wert auf die Einrückung legen.
 
Das was du möchtest ist mit regulären Ausdrücken allein nicht zu machen. Schreibt dir einfach einen kleinen Parser:
PHP:
$buffer = '';
$depth = 0;
for ($i=0, $j=strlen($str); $i<$j; $i++) {
    $char = $str[$i];
    switch ($char) {
    case '{':
        $depth++;
        if ($depth === 1) {
            $buffer .= '[';
        } else {
            $buffer .= $char;
        }
        break;
    case '}':
        $depth--;
        if ($depth === 0) {
            $buffer .= ']';
            continue;
        } else {
            $buffer .= $char;
        }
        break;
    default:
        $buffer .= $char;
    }
}
 
Zurück