mixmastertobsi: preg_replace Problem einzelner Buchstabe

Hallo,

ich habe ein Problem mit einem regulären Ausdruck.

Ich möchte, dass einzelne Buchstaben in einer Zeichenkette entfernt werden.

Beispiel: TEXT h , weitere Text

Nun habe ich folgenden regulären Ausdruck, allerdings entfernt dieser in meinem Beispiel nur das "h" und nicht mehr das Komma. Wenn ich zwischen den h und , zwei Leerzeichen platziere, funktioniert es problemlos.

Ich vermute, dass er er das "komma" nicht mehr beachtet, weil eben das Leerzeichen fehlt. aber eigentlich ist ja eines zwischen dem h und Komma.

"/(\ [^\ ]{0,1}\ )|^([^\ ]{0,1}\ )|(\ [^\ ]{0,1})$/i"
  1. Hello,

    wenn Du sagen könntest, was genau Du zu entfernen wünschst, dann wäre eine Antwort eventuell leichter zu geben.

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Es sollen einzelne Buchstaben entfernt werden.

      In meine Beispiel soll aus "TEXT h , weitere Text" -> "TEXT weitere Text" werden

      1. Hello,

        Es sollen einzelne Buchstaben entfernt werden.

        In meine Beispiel soll aus "TEXT h , weitere Text" -> "TEXT weitere Text" werden

        Dann definiere zuerst, wodurch "Buchstaben" vereinzelt werden. Was darf links und was darf rechts davon stehen? Diese Überlegung sollte dich schon weiterbringen. Und überlege, was "Buchstaben" sind und bedenke auch die Codierung!

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Einzelne Buchstaben sind eben alle Zeichen, bis auf das Leerzeichen. Wenn es am Anfang vom Text kommt, muss nach dem einzelnen Buchstaben ein Leerzeichen kommen, andernfalls mus links und rechts ein Leerzeichen sein.

          1. Tach!

            Einzelne Buchstaben sind eben alle Zeichen, bis auf das Leerzeichen. Wenn es am Anfang vom Text kommt, muss nach dem einzelnen Buchstaben ein Leerzeichen kommen, andernfalls mus links und rechts ein Leerzeichen sein.

            Schau mal, ob du mit Non-Capturing Groups oder Assertions arbeiten kannst (sprich, ob das MySQL-Regexp das kann). Damit sollten sich die Einzelzeichen finden lassen. Anschließend zwei oder mehr Leerzeichen zu einem ersetzen. (Ersetzt dann aber auch Stellen, an denen keine Einzelbuchstaben standen.)

            dedlfix.

            1. Hallo dedlfix,

              wie kommst Du auf MySQL? Das Tag ist "php"…

              @@mixmastertobsi,

              Assertions sind auf jeden Fall ein wichtiger Ansatz. Der Grund dafür ist, dass sich die Matches überschneiden:

              Test h x Rest
               1: ---
               2:   ---
              

              Der Treffer " h " bewirkt, dass das Space zwischen h und x nicht mehr als Treffer für " x " gewertet wird. Du könntest das lösen, indem Du Sequenzen von Einzelzeichen erkennst (mit \s\S(\s\S)*\s - aber Assertions sind eigentlich verständlicher und sollten auch eine schnellere Regex ergeben.

              Eine Assertion sorgt dafür, dass die Regex zwar prüft, ob da eine Leerstelle ist, die Leerstelle aber nicht zum Match hinzuzählt. Ein "positive lookahead" für eine Leerstelle würde durch (?=\s) gebildet.

              Die Zeichen ^ und $, mit denen Du Anfang- oder Ende des String matchst, sind unter der Haube ebenfalls solche Assertions.

              Die Regex lautet also: /\s\S(?=\s)|^\S\s|\s\S$/, und du ersetzt einfach alle Treffer durch einen Leerstring. \s steht für ein beliebiges Whitespace-Zeichen, \S für ein beliebiges Nicht-Whitespace-Zeichen.

              Danach musst Du ggf. noch einen zweiten Durchlauf machen, in dem Du \s+ durch " " ersetzt, damit mehrfache Leerstellen weg sind. Ich glaube, dass Du diese beiden Aufgaben nicht in eine Regex kombinieren kannst.

              Rolf

              --
              sumpsi - posui - clusi
              1. Tach!

                wie kommst Du auf MySQL? Das Tag ist "php"…

                Wegen seines anderen Threads nebenan. Tags nehme ich oft nicht wahr.

                dedlfix.

          2. @@mixmastertobsi

            Einzelne Buchstaben sind eben alle Zeichen, bis auf das Leerzeichen.

            Was heißt Leerzeichen? Nur U+0020 SPACE oder auch andere Whitespace-Zeichen \s (z.B. U+0009 Tabulator, Zeilenumbruch, …) oder auch andere Leerzeichen (z.B. U+00A0 NO-BREAK SPACE)?

            Wenn es am Anfang vom Text kommt, muss nach dem einzelnen Buchstaben ein Leerzeichen kommen, andernfalls mus links und rechts ein Leerzeichen sein.

            Und am Ende?

            Du hast 3 Fälle zu unterscheiden:

            • Anfang, einzelnes Zeichen, Leerzeichen ^.\s – lösche (ersetze durch Leerstring)

            • Leerzeichen, einzelnes Zeichen, Leerzeichen \s.\s – ersetze durch Leerzeichen (welches?)

            • Leerzeichen, einzelnes Zeichen, Ende \s.$ – lösche (ersetze durch Leerstring)

            LLAP 🖖

            --
            “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
            1. Hallo,

              ja, ich meine alles, was auch mit einem Leerzeichen ähnlich ist. In meinem Beispiel sind es nun nur mal "normale" Leerzeichen, aber Tabulatoren o.ä. sollte auch einbezogen sein.