[REGEX] Worte aus Salat regexen? ;)

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

  • [REGEX] Worte aus Salat regexen? ;)

    Hi,

    der Titel triffts nicht ganz.

    Ich habe zB folgenden Text
    Code:
    blaa----foo----bar----huhu----jaja,,,,,,lol......ahah<><<>jaja
    Nun möchte ich alle "wirklichen" Worte daraus holen. Kein Prob, das passiert mit: (Achtung, Forum verschluckt den \ vor dem w)
    PHP-Code:
    $reg "/([\w - äöüß])+/i";
    preg_match_all($reg$value$values);
    print_r($values[0]); 
    Es werden also alle Worte die aus mindestens einem Wort-Zeichen, äöüß, einem Leerzeichen oder "- " bestehen gematcht.


    Nun zu meinem Problem. Es kann ja nun auch folgender Text sein.
    Code:
    php-resource,,,,bar----huhu----jaja,,,,,,lol......aha
    Da Trennt meine Regex natürlich jetzt php-resource in php und resource

    Jemand nen Tipp für mich, wie ich den Sonderfall einfange? Danke.

  • #2
    Ich machs jetzt folgendermaßen:

    PHP-Code:
    $value preg_replace("!([.,-/\\<> @\!?]){2,}!"","trim($value));
    if(
    $value{strlen($value)-1} == ","){
      
    $value substr($value0strlen($value)-1);
    }
    $values explode(','$value); 
    Damit habe ich einen Array mit allen Worten.

    Verbesserungen? Als bei!
    Zuletzt geändert von prego; 10.05.2006, 21:18.

    Kommentar


    • #3
      Ich werfe mal in die Runde (ohne deine zweite Version genau studiert zu haben), dass "php--resource" orthographisch falsch, "php-resource" aber richtig ist. Das gilt für alle mir bekannten Sprachen, deshalb würde ich einen einzelnen Bindestrich zulassen und als Teil eines Wortes ansehen (u.U. auch nur, wenn das gesamte Token lang genug ist, denn a-b ist Quark).

      Und das ganze schön rekursiv, wegen "Verkehr-Insel-Leuchttürmen" und ähnlichem.


      Ich weiß, das hilft dir weniger als ein fertiger regulärer Ausdruck. Aber vielleicht bringts dich wenigstens auf Gedanken, die du bisher noch nicht hattest.

      Kommentar


      • #4
        Leider nicht, weil ich auch noch nichtmal weiß wie ich das rekursiv anstellen soll. Und wenn ich den Bindestrich offiziell als Wert zulasse (einfach so, anhand des ersten beispiels) dann wird ja auch folgendes gematcht:

        lalala-----huhu-ha-----jaja

        Das ist ja genau das, was ich vermeiden will.


        Das zweite Beispiel geht jetzt genau den umgekehrten weg - "Schmeiß alles raus was aus folgenden Zeichen besteht und mindesten 2 Zeichen lang is"


        Danke

        Kommentar


        • #5
          Original geschrieben von prego
          Und wenn ich den Bindestrich offiziell als Wert zulasse (einfach so, anhand des ersten beispiels) dann wird ja auch folgendes gematcht:

          lalala-----huhu-ha-----jaja
          trim($einzelnerTreffer, '-');
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Versuchs mal damit:
            Code:
            /(([\wäöüß ]+\-)*([\wäöüß ]+))/i

            Kommentar


            • #7
              Danke, die Idee ist nicht schlecht. Aber damit bekomme ich nur maximal ein Wort mit einem Bindestrich. Es könnte ja auch sowas sein: "halb-in-der-Hälfte"

              Kommentar


              • #8
                dieser Regex ersetzt erst mal alle Textteile die mehr als 2 Striche
                sind durch Leerzeichen:

                PHP-Code:
                $result preg_replace('/[-]{2,}/'' '$subject); 
                und $result kannst dann "exploden" lassen.

                ---------

                Du kannst innerhalb der eckigen Klammern noch weitere Zeichen angeben oder aber alles ersetzen lassen was nicht a-z etc. ist.

                z.B.: [^\\w]{2,} betrifft alle Zeichen die kein Wortzeichen sind und
                mindestens zwei mal vorkommen
                Zuletzt geändert von Koala; 10.05.2006, 23:42.

                Kommentar


                • #9
                  Erklär mal was du vorhast. Bisher siehts für mich aus wie ein Tokenizer für Textverarbeitung. Wenn dem so ist, dann schau dir doch mal DSPAM, CRM114 u.ä. an.

                  Kommentar


                  • #10
                    Zur Erklärung:

                    Wir haben eine neue Platform geschrieben - funktioniert auch schon etc. pp.

                    Die User dieser Platform können selbst frei Informationen für ihre Profilseite hinterlegen. Jetz sind manche User auf die Idee gekommen so sachen wie "toll---+++---jajaja---+++---fooo" da rein zu schreiben. Da wir jedes Wort in diesem Feld auch noch mit einer Suche verlinken, muss ich ja an die Worte einzeln drankommen. Vorher fand das mit Explode am "," mit anschließendem trim der Werte statt und wurde dann in eine "ordentliche" Komma-getrennte Liste überführt.
                    Aus "huhu,jajaj,hahah" wurde also "huhu, jajaj, hahah" mit Link auf jedem Wort.
                    Aus "toll---+++---welt-herschaft---+++---fooo<><<>douglas a. Adams!?!?!?!foo" soll eine Array mit den Worten werden, am ende also "toll, welt-herschaft, fooo, douglas a. Adams, bar".

                    Ich hoffe ich habs ordentlich erklärt.

                    Momentan benutze ich übrigens "!([,\-\\<>]{1,}|[./]{2,}|[ ]{2,})!"und ersetze alle Matches mit "," und explode dann.


                    Danke für eure Hilfe...

                    Kommentar


                    • #11
                      Machs doch so:
                      PHP-Code:
                      $array array_filter(split("#[^\w\d\s]#"$string)); 
                      (Oder mit einer abgewandelten RegExp...)

                      Kommentar

                      Lädt...
                      X