# [PHP/RegEx] Löschen des Reststrings ab einem bestimmten Zeichen innerhalb des Strings



## micha (22. März 2004)

Hallo liebe PHPler,

ich habe eine Variable, die nach dem Muster

$variable = "teilstringa, teilstringb";
oder
$variable = "teilstringa/teilstringb";

aufgebaut ist.
Ich möchte nun über Regexpressions (glaube preg_xxxx ist die Function, die ich suche) die Variable auf  Enthaltensein des Zeichens "," oder "/" checken und dann ab dem Zeichen (also inklusive des Zeichens meine ich) alles entfernen.

aus 
$variable = "teilstringa, teilstringb";    // Komma auch durch "/" ersetzbar
würde dann
$variable = "teilstringa";

Meiner Vermutung nach benötige ich dazu preg_replace. Aber wie sage ich dem Parser, dass er _ab und inklusive_ des Kommas oder dem Slash alles löschen soll?


----------



## Nils Hitze (22. März 2004)

$string = preg_replace("#[,|/].*#,"",$string);

Sollte das tun was du willst.


----------



## micha (22. März 2004)

Ich teste das gerade mal durch:

$string = preg_replace("#[,|/].*#,"",$string);
muss ersetzt werden durch:
preg_replace('[,|/].*,"",$slashkommaweg')

dann gehts

netter Geekcode übrigens 
habe ich schon seit Jahren nichtmehr gesehen im Internet.

War doch mal in den 90ern total "in" oder ?


// edit, Danke vergessen !

// Edit2

Ebenfalls sollte de Parser am Vornamen einen ggf. vorhandenen Punkt "." also
$variable =  "Müller, N.";
entfernen. Da bekomme ich jedoch immer die Fehlermeldung "Missing Delimiter"
Hier der Code:

```
$tut = "W.";
$hupe = preg_replace ("/./","",$tut);
echo $hupe;
//Ausgabe: Error : Missing Delimiter 
//Erwartete Ausgabe: W
```


----------



## stanleyB (22. März 2004)

```
<?php
$tut = "W.";
$hupe = preg_replace ("/\./","",$tut);
echo $hupe;
?>
```

Der Punkt muss escaped werden - allerdings sollte die str_replace() Funktion hier schneller aggieren (Laufzeit des gesamten Scripts).

sB!


----------



## micha (22. März 2004)

Funktioniert wunderbar,
habt Dank !


----------



## Geordi (19. Dezember 2010)

Hallo zusammen, 
ich versuche das gerade mit = Zeichen hinzubekommen, also alles nach = soll gelöscht werden, inkl. dem =
Leider funktioniert das so wie angegeben nicht 


```
preg_replace("#[=].*#","",$Meldung)
```

Dabei werden nur die = jedoch nicht der nachfolgende Text gelöscht!
Wo steckt der Fehler?

Danke schonmal für die Hilfe!


----------



## chmee (19. Dezember 2010)

Warum die eckigen Klammern? Wenn ich es im Regexonlinetester ausprobiere, komme ich mit preg_replace und *=.** direkt über Ziel und nehme 4000 ein 

```
$string="chmee=phreekz";
$ergebnis=preg_replace("#=.*#","",$string);
echo $ergebnis;
// Ausgabe chmee
```
mfg chmee


----------



## Geordi (19. Dezember 2010)

Hm, hätte ich erwähnen sollen, das in dem Text der da reinkommt, auch noch Umbrüche drinn sind?
Folgender Text würde reinkommen:


> WUEM72 MKXX 190850
> 
> Amtliche UNWETTERWARNUNG vor STARKEM SCHNEEFALL
> 
> ...



Und da klappt das leider wieder nicht


----------



## timestamp (19. Dezember 2010)

Dann musst du noch den Modifikator "m" mit einbauen (multiline):


```
$string="Geht über 
=
mehrere
Zeilen ";
$ergebnis=preg_replace("/=.*/m","",$string);
echo $ergebnis;
```


----------



## Geordi (19. Dezember 2010)

Hm, erzielt auch nicht den gewünschten Erfolg. 
Dabei kommt raus:


> WUEM72 MKXX 190850
> 
> Amtliche UNWETTERWARNUNG vor STARKEM SCHNEEFALL
> 
> ...



Es werden also alle = entfernt, jedoch nicht der nachfolgende Text.

Syr, das ich so oft nachfragen muss, aber von RegEx hab ich leider fast keine Ahnung


----------



## chmee (19. Dezember 2010)

Ich hab das kurz mal im Onlinetester durchgespielt, mit preg_replace würde man den Zeilenumbruch dazunehmen (was ich gerne als Suchzeichen vermeide). Jedenfalls muß man dem regex sagen, dass es Zeilenumbrüche als "normale" Zeichen interpretieren sollte - weiterhin bin ich auf preg_match ausgewichen und nehme den Fund [1]. Ich kann nicht sagen, ob es performancetechnisch einen Unterschied macht. 

```
$string="Dein string oben bla hier bla da
=
und das soll weg";
preg_match("#(.*)(=)(.*)#sU",$string,$ergebnis);
// Modifikatoren
// s für 'Zeilenumbruch als Zeichen interpretieren'
// U für 'Gier unterdrücken'
echo "<pre>"; var_dump($ergebnis); echo"</pre>";

echo "gesucht: <br/>".$ergebnis[1];
```

mfg chmee


----------



## Geordi (19. Dezember 2010)

Hm, das löscht mir irgendwie alles


----------



## chmee (19. Dezember 2010)

Da wird Nix gelöscht, es wird nur Nix gefunden (Unterschied zwischen match und replace)  Ganz ehrlich, ohne ransetzen und ein bissel regex lernen wird es nur eine Mühsal, herauszufinden, warum es bei Dir nicht will. Also, ausprobieren, rumtesten und es selbst herausfinden. sry.

mfg chmee


----------



## Geordi (19. Dezember 2010)

Naja, trotzdem erstmal danke.
Aber das preg_match("#(.*)=(.*)#su",$Meldung,$Meld); nix bringt sieht man ja schon, wenn man meinen Text und die RegEx in den Onlinetester reinwirft und guckt was kommt.


----------



## chmee (19. Dezember 2010)

Benutzt Du den Onlinetester richtig? Bei mir gehts.

Text oben rein
als Suchmuster *(.*)(=)(.*)*
und Modifikatoren links *s* und *U* ein Häkchen setzen (sry, oben hatte ich ein kleines u)
nicht nötig, aber wenn Du willst links auch den Delimiter auf Raute stellen..

(Bei Outputoptionen einfach noch "Rexexp Beispiel zeigen" Häkchen setzen, dann hast Du Deinen php-code)

mfg chmee


----------



## Geordi (19. Dezember 2010)

Hm Okay, fehler gefunden, ABER: strstr($Meldung, '=', true); tuts auch und das viel schneller


----------



## karla50 (20. Januar 2021)

Hallo,
habe das auch mal probiert mit folgendem Code:
$artikelnummer[$i]=preg_replace("#,.*#","",$artikel[$i]);
Also: Lösche alles nach dem ersten Komma incl. dem Komma.

Mein String sieht so aus:
[0] = 12, Artikel -Text - Preis
[1] = 27, Artikel - Text - Preis
[2] = 17, Artikel - Text - Preis

Ergebnis müsste ja sein: 
[0] = 12
[1] = 27
[2] = 17

Allerdings sieht es so aus:
[0] = 12
[1] = 2
[2] = 1

Der gibt mir beim 2. String und allen weiteren nur die erste Zahl aus. Der Rest wird leider nicht ausgegeben.
Kann mir jemand sagen woran das liegt?


----------



## Yaslaw (20. Januar 2021)

Ungetestet, sollte es auch so gehen:
Deine Logikk umgekehrt. Nimm vom Anfang des Strings alle Ziffern.


```
$artikelnummer[$i] preg_replace('/^(\d+)/', '$1', $artikel[$i]);
```


----------

