Ankündigung

Einklappen
Keine Ankündigung bisher.

preg_replace - umlaut am Schluß des Wortes

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • preg_replace - umlaut am Schluß des Wortes

    Hi

    Hab ein Umlaut Problem mit preg_replace. Ich möchte das Wort "weiß" ersetzen.

    PHP-Code:
    preg_replace("/\bweiß\b/i"''"Ich weiß was"
    Das funktioniert nicht, ich habe das Problem leicht eingegrenzt, das Problem ist, dass der Umlaut am Schluß des Wortes steht.

    PHP-Code:
    preg_replace("/\bweiße\b/i"'", "Ich weiße was") 
    Das funktioniert. Das wundert mich und deswegen weiß ich nicht weiter.

    Bin dankbar für jede Hilfe.

  • #2
    Versuch mal den /u Flag zu verwenden

    Kommentar


    • #3
      Wenn ichs so versuche,
      PHP-Code:
      echo preg_replace("/\bweiß\b/u"''"Ich weiß was"); 
      gibt es gar nichts aus und es kommt bei mir die Warnung:
      Warning: preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 6

      Kommentar


      • #4
        Ok, dann lass den "u" modifier weg, denn offenbar ist dein String nicht UTF-8 kodiert. Das Problem ist ein anderes, um word boundaries (\b) zu ermitteln, greift preg_replace mehr oder weniger zuverlässig auf die Einstellungen von [man]setlocale[/man] zu. Ist die nicht deutsch, ist "ß" kein word character und \b matcht zwischen "i" und "ß" statt zwischen "ß" und " ".

        Kommentar


        • #5
          Zitat von fab Beitrag anzeigen
          Ok, dann lass den "u" modifier weg, denn offenbar ist dein String nicht UTF-8 kodiert. Das Problem ist ein anderes, um word boundaries (\b) zu ermitteln, greift preg_replace mehr oder weniger zuverlässig auf die Einstellungen von [man]setlocale[/man] zu. Ist die nicht deutsch, ist "ß" kein word character und \b matcht zwischen "i" und "ß" statt zwischen "ß" und " ".
          Ok aber kann ich das irgendwie ändern, damits funktioniert?

          Kommentar


          • #6
            Am besten an den locale-Einstellungen des Servers. Wenn du darauf keinen Zugriff hast oder nicht weißt, wo das Skript letztendlich zum Einsatz kommt, ist es ratsam auf \w \W und \b nach Möglichkeit ganz zu verzichten. Denn wie gesagt, setlocale() ist nicht sehr zuverlässig und auch stark systemabhängig.
            Reicht es für deinen Zweck vielleicht auch, auf Whitespaces, Satzzeichen und Stringende zu prüfen?
            Code:
            /weiß([[:punct:][:space:]]|$)/
            [unct:] sind druckbare ASCII-Zeichen ohne Ziffern und Buchstaben. Umlaute sind in ASCII nicht enthalten, daher immer ausgenommen.

            Kommentar


            • #7
              PHP-Code:
              /weiß([[:punct:][:space:]]|$)/ 
              Das wäre perfekt, ich brauche nur noch das Zeichen für Wortanfang damit das nicht sowas auch ersetzt wird "blaweiß".

              PHP-Code:
              echo preg_replace("/^weiß$/i"''"Ich weiß was"); 
              So hab ichs auch schon versucht, weil ja ^ eigentlich das Zeichen für Wortanfang sein soll. Der Code funkt bei mir aber auch nicht.

              Kommentar


              • #8
                und \b matcht zwischen "i" und "ß"
                Warum sollte ein \b hinter dem ß davor matchen?

                weil ja ^ eigentlich das Zeichen für Wortanfang sein soll
                Nö, ^ und $ sind Marker für Anfang und Ende des Eingabestrings. Also des ganzen zu untersuchenden Textes. Bzw. der Zeile, je nach Flag.

                Das wäre perfekt
                Kommt auf den Zusammenhang an. Gematchte Zeichen sind „verbrannt“, werden also nicht noch einmal gematcht. versuchst Du das bspw. gleichzeitig an Wortanfang und -ende, werden zwei Wörter in Folge mit abschließenden > führenden Umlauten nicht korrekt verarbeitet werden.

                Kommentar


                • #9
                  Zitat von nikosch Beitrag anzeigen
                  Warum sollte ein \b hinter dem ß davor matchen?
                  Missverständlich ausgedrückt, ich meinte das \b für sich alleine, nicht den gesamten Ausdruck.

                  Kommt auf den Zusammenhang an. Gematchte Zeichen sind „verbrannt“, werden also nicht noch einmal gematcht. versuchst Du das bspw. gleichzeitig an Wortanfang und -ende, werden zwei Wörter in Folge mit abschließenden > führenden Umlauten nicht korrekt verarbeitet werden.
                  Guter Hinweis, um das zu verhindern wären Assertions nötig:
                  Code:
                  /(?<![^[:punct:][:space:]])weiß(?![^[:punct:][:space:]])/
                  Lookbehind-Assertions müssen leider eine feste Länge haben, daher habe ich hier anstatt Whitespace/Punctuation zusammen mit String-Anfang und String-Ende zu testen, negative Assertions verwendet und zusätzlich die Zeichenklasse mit "^" negiert.
                  (?<![^[unct:][:space:]]) bedeutet: Vor dem folgenden steht NICHT ein Zeichen, das NICHT Whitespace/Punctuation ist. Das ist sowohl am Stringanfang als auch bei Whitespace/Punctuation der Fall.

                  Kommentar


                  • #10
                    http://phpforum.de/forum/showthread.php?t=272546

                    Bitte beachten: http://www.php.de/php-einsteiger/ann..._Multipostings

                    Kommentar


                    • #11
                      PHP-Code:
                      /(?<![^[:punct:][:space:]])weiß(?![^[:punct:][:space:]])/ 
                      Dieser Code funktioniert bei mir. Wirklich interessant mit dem doppelten negieren, schon wieder was gelernt

                      Vielen Dank an euch für die Hilfe

                      Kommentar

                      Lädt...
                      X