Hat allerdings immer das Leerzeichen hinter dem Algo mitgenommen, das war unschoen. Ich hab's fuer's erste aufgegeben, den Ausdruck fuer einen Zug nicht zu wiederholen. Hier meine jetzige Loesung samt Tester mit Testfaellen:
PHP-Code:
<?php
test( "foo {R U' R' U' R U R D R' U' R D' R' U2 R' U'} bar" );
test( "foo {R U R' U} Und das U vom Und nicht mitnehmen" );
test( "foo {R U R' U}\nNeue Zeile..." );
test( "foo {R U R' U}" );
function test ( $goal ) { # remove solution markers and try to recreate them
$in = preg_replace( '/[{}]/', '', $goal );
$move = "\b[UDFBLR]('|2|\b)";
$out = preg_replace( "#($move( $move){2,})#", '{$1}', $in );
printf( "%-7s %s\n", $out==$goal?"ok:":"falsch:", $out );
}
In den Testfaellen ist die Loesung markiert (mit geschweiften Klammern). Die Markierung wird erstmal entfernt, das ist dann die Testeingabe. Dann wird versucht, die Loesung wieder zu finden, und das Ergebnis wird mit dem Ziel verglichen.
Ausgabe:
Code:
ok: foo {R U' R' U' R U R D R' U' R D' R' U2 R' U'} bar
ok: foo {R U R' U} Und das U vom Und nicht mitnehmen
ok: foo {R U R' U}
Neue Zeile...
ok: foo {R U R' U}
Also die Zeilen
PHP-Code:
$move = "\b[UDFBLR]('|2|\b)";
$out = preg_replace( "#($move( $move){2,})#", '{$1}', $in );
sind die eigentliche Loesung, es wird nach einem Zug gesucht, der von mindestens zwei weiteren Zuegen gefolgt wird (immer mit einem Leerzeichen Abstand, das koennte man aber auch noch quantifizieren). Kannst es auch ohne die $move-Variable machen, aber das find ich unuebersichtlicher:
PHP-Code:
$out = preg_replace( "#(\b[UDFBLR]('|2|\b)( \b[UDFBLR]('|2|\b)){2,})#", '{$1}', $in );
Mit so einem Prograemmchen bekommt man viel besser Hilfe, siehe auch:
The SSCCE - Short, Self Contained, Correct (Compilable), Example
Kannst es ja mal so im PHP-Forum zeigen und sie fragen, ob sie da noch bessere Ideen haben. Damit verstehen sie besser, um was es geht, und koennen eigene Ideen auch gleich ganz einfach testen.