Hallo Experten,
man stelle sich vor, ich habe einen sehr langen String, verkürzt wie folgt:
XXXBBBXXXXXXXXXAAAXXXXXXAAAXXXXXXXXXXXXBBBXXXXXXBBBXXXXX
Von diesem soll bei jedem Vorkommen eines Suchmusters (hier: BBB oder AAA) der Anteil vor dem Suchmuster abgeknabbert werden und der Rest soll in ein Array geschrieben werden, sodass dieses am Ende folgenden Inhalt hat:
[0] =\> BBBXXXXXXXXXBBBXXXXXXBBBXXXXXXXXXXXXBBBXXXXXXBBBXXXXX
[1] =\> AAAXXXXXXBBBXXXXXXXXXXXXBBBXXXXXXBBBXXXXX
[2] =\> AAAXXXXXXXXXXXXBBBXXXXXXBBBXXXXX
[3] =\> BBBXXXXXXBBBXXXXX
[4] =\> BBBXXXXX
Hierbei spielt die Reihenfolge keine Rolle. Ich habe es so gelöst, dass ich den String ($string) nach dem Suchmuster ($pattern) unter Erhaltung des Suchmusters zerlege und danach aus den Fragmenten ($fragments) von der rechten Seite ausgehend die gesuchten Teilstrings ($fragmentsNew) wiederherstelle:
$string = "XXXBBBXXXXXXXXXAAAXXXXXXAAAXXXXXXXXXXXXBBBXXXXXXBBBXXXXX";
$pattern = "BBB|AAA";
$fragments = preg\_split("/($pattern)/", $string,-1,PREG\_SPLIT\_DELIM\_CAPTURE);
$numberOfFragments = count($fragments);
for($i = $numberOfFragments-1; $i\>1 ; $i=$i-2){
$fragmentsNew[$i/2-1] = $fragments[$i-1].$fragments[$i];
$fragments[$i-2] = $fragments[$i-2].$fragmentsNew[$i/2-1];
}
Im Testsystem funktioniert das prima. Nach dem kompletten Durchlauf des FOR-Loops enthält das Array genau die gesuchten Teilstrings, auch wenn der Originalstring im realen Anwendungsfall bis zu mehrere Millionen Zeichen lang sein kann. Je nach String und Suchmuster erhielt ich die Fehlermeldung, dass zu viel Speicher verbraucht wurde, und das Skript brach ab. Dem konnte ich teilweise entgegenwirken, indem ich das memory_limit in der php.ini auf 2048M hochgesetzt habe. Bei einer gewissen Anzahl der Fragmente ($numberOfFragments), die ich durch probieren ermittelt habe, generiere ich jetzt selbst eine Fehlermeldung und führe den FOR-Loop nicht aus. Wenn es funktioniert (was es jetzt mit der o.g. Einschränkung eigentlich auch tut), dauert die Ausführung je nach Suchmuster von einigen Sekunden bis zu einer guten Minute (mit dem ganzen Rest, der hier nicht aufgeführt ist).
Nun meine eigentliche Frage: Hat jemand eine Idee, wie das Obige speichersparender und/oder schneller bewerkstelligt werden kann, sodass ich evtl. das Limit der Fragmentanzahl hochsetzen könnte oder das Skript nicht ganz so lange braucht?
Viele Grüße
Huttatta