Erik Tews: Text in Wörter aufteilen

Hi

Ich hab folgendes Problem. Ich hab einen Text und will ihn in einzelne Wörter aufteilen. Ohne Satzzeichen und sonstwas. Das Problem ist, dass dort auch URLs vorkommen können. Also bringt es z. B. nichts, wenn man einfach nach / / splittet, und dann alle Satzzeichen rausfiltert. In nem URL kommt ja auch nen Doppelpunkt vor. Ich hab schon mal hier eine Regex gefunden, die einen Text in Wörter aufteilen soll, aber das ging nicht so einwandfrei. Vielleicht kann mir da jemand nen Parameter für Split nennen. Ein Text könnte so aussehen:

Wenn sie noch mehr Informationen über unser Projekt erfahren wollen, dann besuchen sie unsere Webseite http://www.irgendwas.de oder mailen sie an mail@irgendwas.de.

Hat jemand ne Idee, wie ich daraus was machen könnte wie:

Wenn
sie
noch
mehr
über
unser
Projekt
erfahren
wollen
dann
besuchen
sie
unsere
Webseite
http://www.irgendwas.de
oder
mailen
sie
an
mail@irgendwas.de

  1. Hallo Erik

    Ich hab folgendes Problem. Ich hab einen Text und will ihn in einzelne Wörter aufteilen. Ohne Satzzeichen und sonstwas. Das Problem ist, dass dort auch URLs vorkommen können. Also bringt es z. B. nichts, wenn man einfach nach / / splittet, und dann alle Satzzeichen rausfiltert. In nem URL kommt ja auch nen Doppelpunkt vor. Ich hab schon mal hier eine Regex gefunden, die einen Text in Wörter aufteilen soll, aber das ging nicht so einwandfrei. Vielleicht kann mir da jemand nen Parameter für Split nennen.

    Ich würde folgende Parameter verwenden:
    split(/[.:,;?!]*\s+/,$text);

    Es wird dann davon ausgegangen, dass niemand ein Satzzeichen ohne Leerzeichen schreibt.   Evtl. kannst du noch alle Anführungszeichen, Gedankenstriche usw. löschen. Falls das nicht genügen sollte, musst du ein Regexp schreiben, der dir alle URL's herausfiltert.

    Gruss
    Andreas

    1. Hallo Ihr zwei!

      Ich würde folgende Parameter verwenden:
      split(/[.:,;?!]*\s+/,$text);

      Es wird dann davon ausgegangen, dass niemand ein Satzzeichen ohne Leerzeichen schreibt.   Evtl. kannst du noch alle Anführungszeichen, Gedankenstriche usw. löschen. Falls das nicht genügen sollte, musst du ein Regexp schreiben, der dir alle URL's herausfiltert.

      Das mit dem Leerzeichen - bzw. Whitspace, da ja auch Returns dazu gehören - ist bestimmt nicht verkehrt. Bevor man sich aber alle möglichen Sonderzeichen überlegt, kann man wohl auch was mit den Wortgrenzen anfangen: \b. Zwischen den Wortgrenzen dürfen dann nicht-Wortzeichen vorkommen: \W Leerzeichen sind erforderlich: \s

      split (/\b\W*\s+\W*\b/, $text);

      Viel Spaß,
         Jörk

      1. Hallo Jörk

        split (/\b\W*\s+\W*\b/, $text);

        Warum braucht es \b? Ohne würde es ja auch funktionieren. Sonst finde ich deine Lösung auch besser. Allerdings solltest du nicht \W verwenden, da dort auch Umlaute und andere Sonderzeichen enthalten sind.
        Dieser Befehl sollte auch mit Sonderzeichen klar kommen:

        split(/[^\wŠŒšœŸÀ-ÖØ-öø-ÿ]*(?:\s+$)[^\wŠŒšœŸÀ-ÖØ-öø-ÿ]*/, $text);

        Gruss
        Andreas

        1. Hi Andreas!

          split (/\b\W*\s+\W*\b/, $text);

          Warum braucht es \b? Ohne würde es ja auch funktionieren. Sonst finde ich deine Lösung auch besser. Allerdings solltest du nicht \W verwenden, da dort auch Umlaute und andere Sonderzeichen enthalten sind.
          Dieser Befehl sollte auch mit Sonderzeichen klar kommen:

          split(/[^\wŠŒšœŸÀ-ÖØ-öø-ÿ]*(?:\s+$)[^\wŠŒšœŸÀ-ÖØ-öø-ÿ]*/, $text);

          Mit den Umlauten hast Du mich natürlich voll erwischt. Gab es da nicht mal irgendwas mit local? Oder war das erst für ein zukünftiges Perl geplant?

          Das \b kann ich sicher weg lassen, so gefräßig, wie die RegExps sind ... Das plus bei \s sollte eigentlich auch ausgelassen werden können ... da muß man aber wohl mit den Zeilenenden aufpassen!

          Gruß,
          Jörk