Zeichenkette in Text finden, in bestandteile zerlegen

Wutaler

Mitglied
Hallo!

ich bin nach langer Zeit mal wieder da weil ich einfach ein Brett vorm Kopf habe.
Die Lösung wird wahrscheinlich einfach übers pattern und preg_match funktionieren, ich bekomme es aber nicht auf die (Zeichen-)Kette...

Ich schreibe diesen Post noch einmal neu da ich bisschen was im Netz finden konnte...

Also, ich habe folgenden Text in einer Variable:


PHP:
$meinText = "Hallo Welt (1|45634-54354|Name) Du bist so schön (2|43634|Name2) weil es halt so ist!";


Jetzt möchte ich diesen Text durchsuchen lassen undzwar nach diesen Zeichenketten (INT|STRING1|STRING2) und den Inhalt der Klammern verarbeiten...

Wie finde ich also den Inhalt der klammern im Text so das nicht nur die erste Klammer verarbeitet wird, sondern jede weitere?

Darüber hinaus habe ich eine Lösung gefunden, wie ich den Inhalt der Klammer dann verarbeite, aber dazu müsste ja erst einmal die Klammer gefunden werden und wahrscheinlich in einer schleife verarbeitet werden wenn der Text mehr als eine Klammer enthält?

Für die Verarbeitung des Klammerinhaltes habe ich das gefunden:
Gibt es da eine elegantere Möglichkeit als?

PHP:
list($zahl1, $string1, $string2) = explode("|", $meinText);

Hoffe ich konnte mein Problem verständlich ausdrücken und jemand hat da einen Lösungsansatz?!

Gruß Wutaler
 
Zuletzt bearbeitet:
dazu müsste ja erst einmal die Klammer gefunden werden und wahrscheinlich in einer schleife verarbeitet werden wenn der Text mehr als eine Klammer enthält?
Für das Finden brauchst Du noch keine Schleife, wenn Du preg_match_all() verwendest:
PHP:
    $meinText = "Hallo Welt (1|45634-54354|Name) Du bist so schön (2|43634|Name2) weil es halt so ist!";
    preg_match_all("/\(([0-9]+)\|([^|]*)\|([^)]*)\)/", $meinText, $output_array);
    var_dump($output_array);
    for ($i = 0; $i < count($output_array[0]); $i++) {
        $currentnr = $output_array[1][$i];
        echo $currentnr . ' ';
        $currentstr1 = $output_array[2][$i];
        echo $currentstr1 .' ';
        $currentstr2 = $output_array[3][$i];
        echo $currentstr2 . '<br>';
    }
Entwickelt und getestet hier:
http://www.phpliveregex.com
Weil ich nicht weiß, was Du mit den einzelnen Komponenten vor hast, habe ich nur als Demo eine Schleife geschrieben, die die Komponenten ausgibt.
 
Zuletzt bearbeitet:
Hallo Sempervivum und danke für die schnelle und wirklich tolle Lösung!

Ich möchte aus diesem "Konstrukt" einen Link machen, was ja kein Problem sein sollte.
Am Ende muss ich die herausgefilterte Zeichenkette nur durch den erstellten Link ersetzen lassen und per return aus der Funktion zurück an Text senden.

Nochmals, vielen vielen Dank für deine Lösung!
 
Hallo Sempervivum und danke für die schnelle und wirklich tolle Lösung!

Ich möchte aus diesem "Konstrukt" einen Link machen, was ja kein Problem sein sollte.
Am Ende muss ich die herausgefilterte Zeichenkette nur durch den erstellten Link ersetzen lassen und per return aus der Funktion zurück an Text senden.

Nochmals, vielen vielen Dank für deine Lösung!

Okay, ich habe da meinen Mund etwas zu voll genommen... =(

Ich möchte nachdem ich (INT|STRING|NAME) gefunden habe, diese Werte ermitteln und daraus einen link machen der diese Zeichenkette ersetzt. Und das als Funktion.
Quasi soll das so werden:

Ich analysiere die Zeichenkette (1|45634-54354|Name) und zerlege das in PHP dann so:

PHP:
if($currentnr == 1) { 
       $link = "<a href="www.google.de/datei.php?id=$currentstr1">$currentstr2</a>";
}elseif($currentnr == 2) {
       $link = "<a href="www.web.de/anderedatei.php?id=$currentstr1">$currentstr2</a>";
}
return $link;

und der $link soll dann in $meinText die Zeichenkette ersetzen, hoffe ich habe es verständlich erklären können.
 
Wenn Du dir das $output_array ansiehst, erkennst Du, dass der vollständige geklammerte String unter dem Index 0 steht. Dann braucht es nur noch ein str_raplace(), um ihn mit dem Link zu ersetzen:
PHP:
    $meinText = "Hallo Welt (1|45634-54354|Name) Du bist so schön (2|43634|Name2) weil es halt so ist!";
    preg_match_all("/\(([0-9]+)\|([^|]*)\|([^)]*)\)/", $meinText, $output_array);
    var_dump($output_array);
    for ($i = 0; $i < count($output_array[0]); $i++) {
        $currentnr = $output_array[1][$i];
        echo $currentnr . ' ';
        $currentstr1 = $output_array[2][$i];
        echo $currentstr1 .' ';
        $currentstr2 = $output_array[3][$i];
        echo $currentstr2 . '<br>';
        if($currentnr == 1) {
            $link = "<a href=\"www.google.de/datei.php?id=$currentstr1\">$currentstr2</a>";
        } elseif ($currentnr == 2) {
            $link = "<a href=\"www.web.de/anderedatei.php?id=$currentstr1\">$currentstr2</a>";
        }
        $meinText = str_replace ($output_array[0][$i], $link , $meinText);
    }
    echo $meinText;
Dann kannst Du ja das Ganze noch in eine Funktion packen.
 
Die Lösung hatte ich auch. Aber ich habe im str_replace das array vergessen mit [0] auszuwählen. Da war mein Fehler! Danke!
 

Neue Beiträge

Zurück