Bestimmte Sonderzeichen ersetzen (RegEx)

Tucker

Erfahrenes Mitglied
Hallo,
ich habe jetzt einige threads zu RegEx und Sonderzeichen durchgelesen, aber keine passende Antwort gefunden. Selber konnte ich mir nichts passendes zusammen reimen oder bauen. Komme mit der RegEx- Syntax einfach nicht klar.

Aber vielleicht kann mir jemand einen Anreiz geben:

Probelmstellung: Es müssen Sonderzeichen ersetzt werden, allerdings nach einem bestimmten Schema:

  • Leerzeichen in _
  • ? in _
  • , in _
  • . in _
  • ! in _
  • & in _
  • - in _

Sämtliche andere Sonderzeichen sollen oder müssen entfernt werden. Weiß absolut keinen Ansatz, wie man sowas mit RegEx realisieren könnte. Das ist mir einfach zu hoch. :(

Kann mir jemand helfen?
 
Der Reguläre Ausdruck für das erste Problem ist nicht sonderlich kompliziert:
Code:
[\ \!&,\-\.\?]
[\x20\x21\x26\x2C-\x2E\x3F]
Letzteres ist die hexadezimale Darstellung.
Was die andere Frage betrifft, müsstest du „Sonderzeichen“ genauer beschreiben. Was sind in deinem Augen Sonderzeichen?
 
Eigentlich alles andere, was keine Buchstaben und Ziffern sind und auch nicht auf die angesprochenen bzw. aufgelisteten Zeichen zutrift. Z.B. " § $ % / ( ) = € @ > < | ^ ° ` ´ aber auch exotische Zeichen, wie sie z.B. in Microsoft Word vorkommen.
 
Dann sollte folgender Regulärer Ausdruck reichen:
Code:
[^a-zA-Z0-9_]
Die Reihenfolge, wie beide angewendet werden sollte, findest du schon selbst heraus.
 
Hab da jetzt mal was probiert, allerdings führt das nicht zum gewünschten Ergebniss:

PHP:
$string ="Workshop „Lommatzscher Zukunft? - Standortvorteile durch die Nutzung erneuerbarer Energien“";
 $string = preg_replace ( "#[\ \!&,\-\.\?][\x20\x21\x26\x2C-\x2E\x3F]#" , "_" , $string );
 
 print $string . "<br>";
 
 $string = preg_replace ( "#[^a-zA-Z0-9_]#" , "" , $string );
 
 print $string ;

Ergebnis:
Code:
Workshop „Lommatzscher Zukunft__Standortvorteile durch die Nutzung erneuerbarer Energien“
WorkshopLommatzscherZukunft__StandortvorteiledurchdieNutzungerneuerbarerEnergien

Der Fehler steckt wahrscheinlich im ersten Replacement, da die Leerzeichen nicht in einen Unterstrich umgewandelt werden. :(

Weiß jemand, wod er Fehler liegt?
 
Ok, so muss es sein:

PHP:
$string = preg_replace ( "#[\ \!&,\-\.\?]#" , "_" , $string );
 $string = preg_replace ( "#[\x20\x21\x26\x2C-\x2E\x3F]#" , "_" , $string );
 $string = preg_replace ( "#[^a-zA-Z0-9_]#" , "" , $string );
 
Die ersten beiden Regulären Ausdrücke sind äquivalent. Der zweite ist lediglich die hexadezimale Darstellung des ersten.
 
Zurück