Jannes: RegExp entfernen alle nicht Wortzeichen, ausser Bindestrich

Hallo zusammen,

da sind sie wieder, die Regulären Ausdrücke, (uuäähh). Ich habe eine Textmenge, die bis hier perfekt für meine Zwecke (das indexieren aller einzelnen Wörter) vorbereitet ist. Nur alle Nichtwort-Zeichen sollen noch raus:
preg_replace('/\W+/',' ',$text)

Hhm, nein, doch nicht alle! Das - (Minuszeichen/Bindestrich) möchte ich behalten. Anstelle des Versuchs, alle evtl. vorkommenden Nichtwortzeichen in mir unbekannten Texten z.B. per str_replace zu entfernen und so den - stehen zu lassen, möchte ich die wissenden Forumsteilnehmer bitten mir zu sagen ob _das_ geht. Andere Ansätze funktionieren leider nicht, das habe ich schon gelernt. Aber hier keimt doch ein beachtenswerter Hoffnungsschimmer in mir ;-)

Gruß,
Jannes

  1. Hello,

    wenn Du nur Zeichen entfernen willst, dann benötigst Du keine Regular Expression, dann kannst Du das mit str_replace() oder str_ireplace()
    http://www.php.net/manual/en/function.str-replace.php

    erledigen. Die Array-Variante davon ist genau das Richtige für die Aufgabe.

    Liebe Grüße aus dem Cyberspace

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. wenn Du nur Zeichen entfernen willst, dann benötigst Du keine Regular Expression, dann kannst Du das mit str_replace() oder str_ireplace()
      http://www.php.net/manual/en/function.str-replace.php

      Ich fürchte er weiß nicht, welche Zeichen er entfernen will, weil er nicht weiß welche Zeichen vorkommen könnten.

      1. Hi Texter mit x,

        »» wenn Du nur Zeichen entfernen willst, dann benötigst Du keine Regular Expression, dann kannst Du das mit str_replace() oder str_ireplace()
        »» http://www.php.net/manual/en/function.str-replace.php

        Ich fürchte er weiß nicht, welche Zeichen er entfernen will, weil er nicht weiß welche Zeichen vorkommen könnten.

        ja, das Du das weißt, beweist ganz deutlich, das Du das Ausgangsposting auch gelesen hast, bevor Du antwortest. Finde ich gut!
        (sollten viel mehr Leute so machen)

        Gruß,
        Jannes

        1. Hello,

          ja, das Du das weißt, beweist ganz deutlich, das Du das Ausgangsposting auch gelesen hast, bevor Du antwortest. Finde ich gut!
          (sollten viel mehr Leute so machen)

          Und wenn dies eine Fortsetzung des benannten Threads ist und kein neues Problem, dann solltest Du den alten Thread
          https://forum.selfhtml.org/?t=185389&m=1230136
          auch fortsetzen und nicht einfach einen neuen aufmachen!

          Liebe Grüße aus dem Cyberspace

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. »» ja, das Du das weißt, beweist ganz deutlich, das Du das Ausgangsposting auch gelesen hast, bevor Du antwortest. Finde ich gut!
            »» (sollten viel mehr Leute so machen)

            Und wenn dies eine Fortsetzung des benannten Threads ist und kein neues Problem, dann solltest Du den alten Thread
            https://forum.selfhtml.org/?t=185389&m=1230136
            auch fortsetzen und nicht einfach einen neuen aufmachen!

            das ist erstens falsch und zweitens ist die Änderung des Threadtitels kindich von Dir. (Oder hast du den verlinkten Thread auch einfach _nur_nicht_gelesen?)

            Ich bin mir sicher, das Du die Forumsregeln und das erwartete Verhalten hier im Forum besser kennst als ich. Du hast anderen Teilnehmern diese oft genug schon aufgezeigt.

            Gruß,
            Jannes

  2. Hallo,

    Das - (Minuszeichen/Bindestrich) möchte ich behalten. Anstelle des Versuchs, alle evtl. vorkommenden Nichtwortzeichen in mir unbekannten Texten z.B. per str_replace zu entfernen und so den - stehen zu lassen, möchte ich die wissenden Forumsteilnehmer bitten mir zu sagen ob _das_ geht.

    Eine Möglichkeit wäre, zuerst alle Bindestriche durch eine spezielle Zeichenfolge zu ersetzen, die sonst sicher nicht vorkommt, vielleicht einen betimmten MD5-Hash oder sowas. Dann alle Nicht-Wortzeichen global ersetzen und schließlich die Spezialzeichenfolge wieder global in Bindestriche zurückwandeln.

    Umständlich und nicht besonders performant, aber immerhin – Problem gelöst! Quasi von hinten durch die Brust ins Auge getroffen...

    Gruß, Don P

    1. Hi Don P,

      Eine Möglichkeit wäre, zuerst alle Bindestriche durch eine spezielle Zeichenfolge zu ersetzen, die sonst sicher nicht vorkommt, vielleicht einen betimmten MD5-Hash oder sowas. Dann alle Nicht-Wortzeichen global ersetzen und schließlich die Spezialzeichenfolge wieder global in Bindestriche zurückwandeln.

      ja, den nehm ich! Ansatzweise hatte ich daran auch schon gedacht, habs aber verworfen, weil mir <kleines_Brett_vorm_Kopf> _kein_ sicheres Ersetzungszeichen </kleines_Brett_vorm_Kopf> eingefallen ist. Ein MD5-Hash o.ä. ist gut. Das wird gehen.

      Umständlich und nicht besonders performant, aber immerhin – Problem gelöst! Quasi von hinten durch die Brust ins Auge getroffen...

      Nö, das ist schon gut, und evtl. weniger umständlich als sich mit RegExp-Versuchen am Ende doch nur bestenfalls die Haxen zu brechen. ;-)

      Danke & Gruß,
      Jannes

    2. Eine Möglichkeit wäre, zuerst alle Bindestriche durch eine spezielle Zeichenfolge zu ersetzen, die sonst sicher nicht vorkommt, vielleicht einen betimmten MD5-Hash oder sowas. Dann alle Nicht-Wortzeichen global ersetzen und schließlich die Spezialzeichenfolge wieder global in Bindestriche zurückwandeln.

      Konvertiere nichts, das du nicht konvertieren musst.

      Umständlich und nicht besonders performant, aber immerhin – Problem gelöst! Quasi von hinten durch die Brust ins Auge getroffen...

      Jetzt musst du nur noch wissen, aus welchen zeichen ein MD5 Hash besteht.
      In seiner base64 Form ist ein + eventuell vorhanden, das bei einer Rückkonvertierung zu Komplikationen führen kann.
      Die sind zwar vermeidubar, aber ich tippe dennoch eher auf einen Schuss in den Fuss.

      mfg Beat

      --
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      Der Valigator leibt diese Fische
  3. preg_replace('/\W+/',' ',$text)

    \W ist glaube ich systemabhängig und umfaßt vielleicht das was Du denkst, vielleicht aber auch nicht.

    [^-_A-Za-z0-9] kommt dem nahe (ist auch systemabhängig) und der Bindestrich ist mit drin.

    1. [^-_A-Za-z0-9] kommt dem nahe (ist auch systemabhängig) und der Bindestrich ist mit drin.

      [^-_A-Za-z0-9\s] die withespace-zeichen sollen auch noch drin bleiben. SO klappts. Super.

      Danke,
      Jannes

    2. [^-_A-Za-z0-9] kommt dem nahe (ist auch systemabhängig) und der Bindestrich ist mit drin.

      Das ist schon mal gefährlich. Du beginnst mit einer unvollständigen Range.
      Maskiere das Minus-Zeichen, wenn du keine Range meinst, oder stelle es an den Schluss
      [^A-Za-z0-9_-]

      mfg Beat

      --
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      Der Valigator leibt diese Fische
      1. »» [^-_A-Za-z0-9] kommt dem nahe (ist auch systemabhängig) und der Bindestrich ist mit drin.

        Das ist schon mal gefährlich. Du beginnst mit einer unvollständigen Range.
        Maskiere das Minus-Zeichen, wenn du keine Range meinst, oder stelle es an den Schluss
        [^A-Za-z0-9_-]

        Müßte ich das ^ nicht maskieren, damit es mit dem - als (unvollständige) Range erkannt wird? Aber Du hast Recht, wenn man den Bindestrich ans Ende setzt, muß man sich darüber nicht den Kopf zerbrechen.