ersetzen aller Zeichen eines String bis zum ersten Vorkommen eines bestimmten Zeichens

rernanded

Erfahrenes Mitglied
Hallo
wie ersetze ich alle Zeichen eines String bis zum ersten Vorkommen eines bestimmten Zeichens.

Beispiel:
Alles bis zum ersten . soll bei der Ausgabe ersetzt werden durch ### inklusive des .

123.ichbindeinfreund.naund.
hallodu.oberkommmalrüber.jetzt!
w.er.bin.ich,denn-wieso

Ergebnis:

###ichbindeinfreund.naund?
###ober,kommmalrüber.jetzt!
###er.bin.ich,denn-wieso?

MONI
 

Sempervivum

Erfahrenes Mitglied
Hallo Moni, das ist relativ einfach:
Code:
$subject = '123.ichbindeinfreund.naund.';
$pattern = '/^[^.]+\./';
$replace = '###';
echo preg_replace($pattern, $replace, $subject);
 

rernanded

Erfahrenes Mitglied
@Sempervivum Super danke.
Aber geht das auch mit jedem Zeichen, also auch mit / der ja ein Delimiter ist?

Ich habe schon probiert mit
PHP:
$pattern = '/^[^.]+\//';
wer//ist.mein:freund?

und herauskam

ist.mein:freund?

und nicht

/ist.mein:freund?

Oder muß es lauten:

PHP:
$pattern = '/^[^/]+\//';
Womit aber nichts mehr geht.

Bedenke, regex ist nicht mein Ding.
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
In dem Fall musst Du den Slash auch innerhalb der eckigen Klammern escapen, d. h. einen Backslash voran stellen, dann funktioniert es.
Code:
/^[^\/]+\//
Ich dachte vorhin daran, eine Funktion zu schreiben, der man das Zeichen als Parameter übergibt, aber die Tatsache, dass man manche Zeichen escapen muss und andere nicht, macht es ein wenig kompliziert. Vielleicht ein Array benutzen mit den Zeichen, die eine besondere Bedeutung in Regex haben.
 

Sempervivum

Erfahrenes Mitglied
Mir scheint, dass innerhalb der eckigen Klammern nur der Slash seine Sonderbedeutung behält. Das ermöglicht diese einfache Funktion:
Code:
function replace_start($char, $replace, $subject)
{
    if ($char == '/') {
        $delim = '\/';
    } else {
        $delim = $char;
    }
    $pattern = '/^[^' . $delim . ']+[' . $delim . ']/';
    return preg_replace($pattern, $replace, $subject);
}

echo replace_start('/', '###', '123/ichbindeinfreund/naund/');
echo replace_start('?', '###', '123?ichbindeinfreund?naund?');
echo replace_start('|', '###', '123|ichbindeinfreund|naund?');
Allerdings habe ich nicht alle Sonderzeichen ausgetestet.
 

Neue Beiträge