Announcement

Collapse
No announcement yet.

Problem mit preg_match und Umlauten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit preg_match und Umlauten

    Hallo,

    per Simple HTML Dom hole ich den Plaintext einer bestimmten Webseite ab und Werte dort häufigkeit verschiedener Wörter aus. Die einzelnen Wörter inklusive derer Häufigkeiten werden dann in einem Array gespeichert.

    Hierbei will ich natürlich noch unerwünschte Stringketten (die Keine "Wörter" darstellen) aussen vor lassen. Dies mache ich, indem ich jedes einzelne Wort im Array nochmal prüfe, wie folgt:

    PHP Code:
    preg_match('/^[A-Za-z_0-9!#\$%&\'\*\+\/=\?_-]{1,40}$/'$new_term)) 
    Jedoch werden hier keine Umlaute erkannt. Mit

    PHP Code:
    preg_match('/^[A-Za-z_0-9öäüÖÄÜ!#\$%&\'\*\+\/=\?_-]{1,40}$/Ui'$new_term
    funktioniert es auch nicht. Ich habe nun schon lange herumgesucht aber nichts wirklich hilfreiches gefunden außer dass auch die Codierung von Quelle und Regexp gleich sein muss. Ich habe auch verschiedene Varianten getestet und eine Lösung gefunden mit der es teilweise funktioniert (Codierung des zu durchsuchenden Textes geändert). Dann bekomme ich jedoch ein "?" an die Stelle des Sonderzeichens und Großbuchstaben (bei den Umlauten) werden nicht gefunden.

    Gibt es eventuell eine clevere Lösung für mein Problem?

    Danke schonmal für die Antworten!

    Grüße

  • #2
    Denke, dass deine Ausdrücke zu prüfen wären:

    Am Anfang ein Zeichen [A-Za-z_0-9!#\$%&\'\*\+\/=\?_-] aus dieser Gruppe und das mindestens einmal, aber höchsten 40-Mal und das das Ende der Zeichenkette. Das ist so gewünscht?

    Vielleicht beschreibst du, was der Ausdruck bewirken soll bzw. was
    unerwünschte Stringketten (die Keine "Wörter" darstellen)
    das heissen soll. ggf. hilft

    http://www.regexplanet.com/advanced/java/index.html
    Christian

    Comment


    • #3
      Hallo Christian,

      danke für deine Antwort.

      Nein das mit dem {1,40} ist nicht unbedingt eine Vorraussetzung (anders funktioniert der Regex-Code aber nicht?). Ich muss gestehen, dass ich mich mit Regularexpressions nicht sonderlich gut auskenne.

      Hier mal ein Beispielarray:

      Array
      (
      [&] => 14
      [more] => 12
      [fã¼r] => 8
      [winter] => 8
      [österreich] => 6
      [urlaub] => 6
      [wellness] => 5
      [schladming] => 5
      [hotel] => 4
      [republika] => 4

      [2013] => 4
      [kunst] => 4
      [karte] => 4
      [sommer] => 4
      [alpine] => 4

      [2012] => 4
      [designhotels] => 4
      [kultur] => 3
      [für] => 3
      [besten] => 3
      [countries] => 3
      [festspiele] => 3

      [ã–sterreichs] => 3
      [schã¶nsten] => 3
      [hã¼tte] => 3

      [gustav] => 3
      [design] => 3
      [infos] => 3

      [weihnachtsmã¤rkte] => 3
      [ferienhaus] => 3
      [baden] => 3
      [golf] => 3

      [ã¼berspringen] => 3
      [architektur] => 3
      [kinder] => 3
      [werbung] => 2
      [winterurlaub] => 2
      [wintertyp] => 2
      [tirol] => 2
      [jahr] => 2
      [entspannt] => 2
      [bilder] => 2
      [kulturveranstaltungen] => 2
      [bregenzer] => 2
      [kärnten] => 2
      [vorarlberg] => 2

      [facts»] => 2
      [donau] => 2
      [bundesländer] => 2
      [niederösterreich] => 2
      [bookbasic] => 2
      [discoverplansearch] => 2
      [angebote] => 2
      [skigebieten] => 2
      [aktuelle] => 2
      [entdeckenplanensuchen] => 2

      [buchenwissenswertes»] => 2
      [tirols] => 2
      [spezialitäten] => 2
      [nachhaltigkeit] => 2
      [musik] => 2
      [tradition] => 2
      [natur] => 2
      [radfahren] => 2
      [wiener] => 2
      [langlaufen] => 2
      [mountainbiken] => 2
      [ausflugsziele] => 2
      [handwerk] => 2
      [individuell] => 2
      [kulinarik] => 2
      [klimt] => 2
      [museum] => 2
      [salzburger] => 2

      [ã¼ber] => 2
      )
      Dabei würde ich die grün markierten gerne ausfiltern, die orangen gerne ausfiltern (jedoch sind hier umlaute falsch dargestellt, wie bringe ich die hier auf eine saubere Form, bei einigen grün-markierten funktioniert die Codierung ja auch richtig?). Die roten sollen ausgefiltert werden (Sonderzeichen enthalten, oder nur numerisch).

      Eventuell hat jemand ja eine Idee.

      Viele Grüße und schöne Weihnachten!

      Comment


      • #4
        Also ich kann das kaum erkennen und verstanden habe ich das auch nicht

        die grün markierten gerne ausfiltern
        Ok, alle grünen sollen raus

        die orangen gerne ausfiltern
        Ok, die orangen sollen auch raus, haben aber "kaputte" Umlaute

        Die roten sollen ausgefiltert werden (Sonderzeichen enthalten, oder nur numerisch).
        Ok, von den roten sollen nur die übrig bleiben, die Buchstaben enthalten. Die roten sind offenbar Texte mit Sonderzeichen oder nur Ziffern?

        Na deinem Beispiel bleibt von der obigen Liste keiner bestehen:

        Alle grünen und orangen sind raus, alle roten sind raus, weil sie Sonderzeichen oder Ziffern enthalten

        Nein das mit dem {1,40} ist nicht unbedingt eine Vorraussetzung (anders funktioniert der Regex-Code aber nicht?)
        Das sollte so nicht sein

        Wenn einige Text korrekte Umlaut enthalten nd andere nicht -> kommen die aus der gleichen Quelle?
        Christian

        Comment


        • #5
          Ich lasse dieses Array durch eine Schleife laufen und möchte grün + orange (mit korrekten umlauten) in ein neues array (gesäubert) schreiben. Nur rot soll gar nicht übernommen werden. Hier habe ich mich wohl falsch ausgedrückt.
          Die einzelnen Terme kommen alle aus der selben Textquelle.

          Comment


          • #6
            Das Problem ist doch in zwei Schritte zu zerlegen:
            Einmal die Klärung, warum dort falsch codierte Zeichen drin sind und
            das aussortieren der nicht gewollten Strings

            Du kannst entweder feststellen, ob bestimmte Zeichen enthalten sind und dann den String übernehmen oder verwerfen. Dazu ist entweder die Gruppe der gewünschten Zeichen festzulegen oder die Gruppe der unwerwünschten Zeichen. Je nachdem, was kürzer ist. Ich habe noch nicht so richtig erkennen können, welche Zeichen nun erwünscht sind oder nicht. Im Beitrag #1 waren ja durchaus auch Zahlen und Sonderzeichen im Ausdruck, als auch Buchtstaben.

            Wenn du die Ursache für die unterschiedliche Zeichenkodierung nicht finden kannst, bleibt immer noch der "harte" Weg in einem Zwischenschritt die String durchzugehen und bsp. alle ã¼ mit einem ä zu erstzen usw.
            Christian

            Comment


            • #7
              Danke für die Hilfe! Werde dann im ersten Schritt erstmal das Array säubern und dafür sorgen, dass dort korrekte Umlaute angezeigt werden.
              Wie würdest du an die Filterung herangehen, so dass nur Wörter (+ Wörter mit Umlauten) aufgegriffen werden?

              Comment


              • #8
                Mit der Zeichenklasse \w -> nur Buchstaben
                Christian

                Comment


                • #9
                  Originally posted by Christian Marquardt View Post
                  Wenn du die Ursache für die unterschiedliche Zeichenkodierung nicht finden kannst, bleibt immer noch der "harte" Weg in einem Zwischenschritt die String durchzugehen und bsp. alle ã¼ mit einem ä zu erstzen usw.
                  Ich würde sagen das Problem ist das er eine UTF8-Codierte Webseite bekommt und diese nicht richtige Decodiert um sie uncodiert zu bekommen.

                  Comment


                  • #10
                    Joo, das wäre es, aber warum sind dann einige richtig?
                    Christian

                    Comment


                    • #11
                      Originally posted by Christian Marquardt View Post
                      Joo, das wäre es, aber warum sind dann einige richtig?
                      Stimmt. Es wäre gut zu wissen wie die Quelldatei wirklich aussieht. Manche Webseiten sind teilweis so fehlerhaft implementiert das evtl. die korrekten einfach nur fehlerhaft im HTML-Code vorliegen oder aus nachgeladenen anders Codierten Dateien kommen.

                      Comment


                      • #12
                        Ja, das koennte es sein...
                        Christian

                        Comment

                        Working...
                        X