[PHP] String zwischen zwei Zeichen extrahieren

AMD-Hammer

Grand Admiral Special
Mitglied seit
05.10.2003
Beiträge
2.760
Renomée
123
Standort
Bornheim (Rheinland)
Hallo an alle!

Ich hab mal wieder eine Frage zum Thema PHP. Also ich habe einen String. Aus diesem String wuerde ich gerne zwischen einem Anfangs und einem Endzeichen den Text in eine extra variable laden.

Beispiel:
$string = "Das ist ein BEGIN Test END für P3D";
$anfang = "BEGIN";
$ende = "END";

Der Text zwischen $anfang und $ende soll extrahiert werden.

Ausgabe:
$substr = "Test"

Gibts es hierfür eine Funktion? Konnte nichts im PHP Handbuch finden? Habt Ihr eine Idee wie ihr das realisieren kann?
 
Danke fuer den Tipp, hat mir schonmal sehr weiter geholfen. Ich hab es jetzt halbwegs hinbekommen.
PHP:
$str = "Das ist ein BEGIN Test END für P3D";
preg_match_all("=BEGIN[^>](.*)END=siU", $str, $a);
echo $a[1][0];
Code:
// AUSGABE
Test

Allerdings gibt es jetzt noch ein Problem! Wie mache ich es wenn dieser String mehrmals im Text ist? Er gibt immer nur den ersten aus! Mit einer While Schleife funktionierts auch nicht.
PHP:
while (preg_match("=BEGIN[^>](.*)END=siU", $str) {
$str = "Das ist ein BEGIN Test END für BEGIN Test2 END P3D";
preg_match_all("=BEGIN[^>](.*)END=siU", $str, $a);
echo $a[1][0];
}

Danke im vorraus...
 
Getreu dem Motto "Viele Wegen fuehren nach Rom" hab ich es jetzt hinbekommen. Der Tipp von ALT255@Seti hat mir den letzten entscheidenen Anstoss geben, habs jetzt :)

Vielen Dank :)
 
Für Dich vermutlich schon verjährt, weil andere Lösung gefunden - aber vielleicht stolpert mal jemand anders drüber.

preg_match_all ist durchaus dazu gedacht alle Treffer zu finden - und das im Grunde äußerst effizient.

Wenn ich das jetzt grad noch richtig aus meiner Erinnerung krame, dann läuft Dein
PHP:
bla(.*)END
bis zum letzten END. Mit
PHP:
bla(.*?)END
sollte dagegen beim jeweils ersten Auftreten den jeweiligen Treffer finalisieren.

Just my 2 cents,
Tom
 
Ich meinte es in dem Fall etwas anders, als von dir verstanden, aber es ist vielleicht ganz sinnvoll, wenn man hier auch die Lösung schreibt, denn so wird auch anderen geholfen.

Ich meinte, dass es ja auch vorkommen kann (um mal beim Beispiel von oben zu bleiben), dass in der String wiefolgt aussieht:
PHP:
$str="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. BEGIN Ut enim ad minim veniam, quis nostrud exercitation ullamco END laboris nisi ut aliquip ex ea commodo consequat. BEGIN Duis aute irure dolor in reprehenderit in voluptate velit esse END cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
In diesem String sind nun zwei Treffer! Wenn man die einzeln isolieren, bearbeiten und wieder zusammensetzen will kann man wie folgt agieren:
PHP:
$output = "";
$count = "0";
  while (isset($str[$count])) {
  if (preg_match("=BEGIN[^>](.*)END=siU", $str[$count])) {
      $str[$count] = "BEGIN".$str[$count];
      preg_match_all("=BEGIN[^>](.*)END=siU", $str[$count], $a);
      $search_str[$count] = "BEGIN".$a[1][0]."END";
      $replace = "STATT BEGIN UND END STEHT JETZT DAS HIER";
      $output .= str_replace($search_str,$replace,$str[$count]);
  } else {
      $output .= $str[$count];
  }
  $count++;
  }
echo $output;
Ausgabe:
Ausgabe schrieb:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. STATT BEGIN UND END STEHT JETZT DAS HIER laboris nisi ut aliquip ex ea commodo consequat. STATT BEGIN UND END STEHT JETZT DAS HIER cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Ich hoffe es war verständlich...
 
Zuletzt bearbeitet:
@AMD-Hammer

wenn Du nur den Text austauschen mußt - wie wärs denn damit ?
PHP:
$output = preg_replace( "=BEGIN[^>].*END=siU", "STATT BEGIN UND END STEHT JETZT DAS HIER", $str);

Weiß ja nicht, ob die Anzahl auch wichtig ist
PHP:
preg_match_all("=BEGIN[^>].*END=siU", $str, $a);
$count = count($a[0]);

Zugegeben - wenn selten aufgerufen mit wenigen Treffern wirst Du den Unterschied nicht spüren (ansonsten ein kleiner Beitrag die CPU ein klein wenig zu entlasten)

Gruß,
Tom
 
Gute Idee, aber in meinem Fall nicht anwendbar, da für meinen Einsatz, den String nicht ersetze sondern davor und dahinter teile des Strings wieder einfuege! Ist sehr komplex ;)

Aber wenn man ihn nur ersetzen will ist, preg_replace vermutlich sinnvoller.
 
@AMD-Hammer

na gut - kann ich gerade noch so mit leben ;D

Aber die Aktion rettet die Regenwälder - schont die Server-CPUs ist noch nicht ganz abgeblasen:

Die While-Schleife ist immer noch recht teuer - in jedem Loop 2 mal den regulären Ausdruck compilieren lassen (macht PHP intern - wenn kein Optimizer das cached) ...

PHP:
preg_match_all(......,$treffer);
$count=count($treffer[0]);
for($i=0;$i<$count;$i++) {
    mach was mit $treffer[0][$i]...
}

Da kannst Du Dich nach Herzenslust mit Deinen komplexen Geschichten austoben.

Gruß,
Tom
 
Zuletzt bearbeitet:
Ich saufe eigentlich nur für Regenwälder, aber das is natürlich auch mal ne Initiative *chatt*

Sieht gut aus der Quellcode... muss ich gleich mal mit rumspielen *g*
 
Zurück
Oben Unten