Internetadresse, Email und Zahl aus EINEM String abfragen?!?

  • Moinidoini zusammen. ;)

    Ich habe einen String ($tteexxtt") und möchte aus dem die URL, die Emailadresse und eine ggf. reine Zahl dort abfragen.

    Im String kann später alles reingeschrieben werden
    - Text ohne URL oder Emailadresse oder Zahl (Bsp.: Ich bin ein Beispieltext)
    - Text mit URL und/oder Emailadresse und/oder Zahl (Bsp.: melden bei maxi_musterfrau@domain.de oder anrufen oder was posten auf https://autoit.de/www.forum.com. mal sehen was du möchtest und das ganze geht nicht mal ebend nach dem 0815471160123.)
    - nur Emailadresse
    - nur Internetadresse
    - nur eine Zahl (reine zahlen ohne Bundestriche oder so)

    Mein Screipt sieht bis jetzt so aus:

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $tteexxtt = "ich bin eine www Internetdomain: http://www.autoit.de und ich bin eine @ Emailadresse: [email='info@autoit.de'][/email] zum mailen und ich bin die Zahl 1234567891123 und nach mir soll man auch suchen können."
    local $sucheinternetadr = "www."
    local $mail = "info"
    local $bis = " "
    Local $aArray1 =_StringBetween($tteexxtt,$sucheinternetadr, $bis)
    Local $aArray2 =_StringBetween($tteexxtt,$mail, $bis)

    [/autoit] [autoit][/autoit] [autoit]

    _test($tteexxtt, $sucheinternetadr, $bis)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"suchen", "Es geht um eine Internetadrese: " & $sucheinternetadr & $aArray1[0]) ; INet Adr. ausgeben
    MsgBox(0,"mailen", "Es geht um eine Emailadresse, aber es fehlt das was vor dem @ steht im String.: " & $aArray2[0]) ; Email ausgeben
    MsgBox(0,"Zahl", "Es geht darum eine Zahl, die 10-13 Stellen lang sein kann, im String zu finden. Aber wie?") ; Zahl ausgeben

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _test($tteexxtt, $sucheinternetadr, $bis)
    If @error Then
    MsgBox(4096, "Fehler", "String enthält nicht die gesuchten vier kleinen w's")
    Exit
    EndIf
    EndFunc

    [/autoit]

    Fragen:
    1.)
    Wie frage ich die GANZE Emailadresse ab? Sie kann in einem Text stehen oder für sich alleine. Zeile 6 ist wohl nicht die sinnvollste Lsg.
    2.)
    Wie frage ich die Zahl ab? Sie kann in einem Text stehen oder für sich alleine.

    Wenn Domain und/oder Emailadresse ; und Zahl im String sind, dann Emailadresse ausgeben in MsgBox! (siehe: Script Zeile 19)
    Wenn erst Domain und dann Emailadresse; und keine Zahl im String ist, dann Domainausgeben in MsgBox!
    Wenn erst Emailadresse und dann Domain; und keine Zahl im String ist, dann Emailadresse ausgeben in MsgBox!
    Wenn nur Emailadresse im String ist; dann Emailadresse ausgeben in MsgBox!
    Wenn nur Internetadresse im String ist; dann Internetadresse ausgeben in MsgBox!
    Wenn nur eine Zahl im String ist; dann Zahl ausgeben in MsgBox!


    So, mal sehen ob man mich verstanden hat und ob man mir helfen kann?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (23. Dezember 2013 um 20:31)

  • Ich würde mal sagen das ist am einfachsten mit regulären Ausdrücken also

    [autoit]

    stringregexp

    [/autoit]


    realisierbar.

    So kannst du recht gut Regeln definieren welche Zeichenfolgen für welchen Typ an Daten in Frage kommen.

    Eine Email Adresse ist z.B. immer so aufgebaut:

    x-beliebige Zeichen + @ + n * (x-beliebige Zeichen + ".") + x-beliebige Zeichen
    wobei x-beliebige Zeichen insofern eingeschränkt ist, dass Leerzeichen (und einige andere Zeichen wie z.B. das @ Zeichen) nicht darin vorkommen dürfen. Ich bin was Reguläre Ausdrücke angeht aber leider auch nicht fit. Es dürfte aber nicht besonders schwer sein ein auf obige Beschreibung passendes Pattern zu entwerfen.


    Das selbe kann man auf Internetadressen anwenden. Auch hier gibt es Regeln wie diese aufgebaut sein müssen/dürfen, welche man in regüläre Ausdrücke umsetzen kann.

    Bei der Telefonnummer (sofern die Zahl eine solche sein sollte) wird es nicht ganz so eindeutig, da es verschiedenste erlaubte Schreibweisen gibt, z.B. mit oder ohne Ländervorwahl, getrennt mit Leerzeichen, Bindestrichen oder Schrägstrichen usw. Aber auch das ist realisierbar.


    Du brauchst also nur einen RegExp Profi oder musst dich selbst damit auseinandersetzen. Das ganze nur mit den Stringfunktionen zu lösen wäre jedenfalls ziemlich aufwendig.

  • Mit reguläre Ausdrücke bin ich auch nicht fit. :(

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    eMail regexen ist eklig. Du solltest dazu im Vorfeld schon definieren, welches reguläre Mailadressen sein können. Ein Pattern, dass so ziemlich alle Adressvarianten abdeckt ist mal eben locker 1000 Zeichen lang.

    Aber mit dem hier sollte das meiste abgedeckt sein: ^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$

    Edit: Kurze Erklärung warum das so lang sein könnte. Das gilt dann, wenn du gleich auf Gültigkeit der Adressen prüfst (also keine Trash- od. Fakemails)

    • Offizieller Beitrag

    Hallo

    Musste mich letzens mit E-Mail adressen Auseinander setzen und hab mal ein wenig gegoogelt. Ja es gibt riesige Pattern, auch offizielle Pattern, die sind aber alle nicht wirklich gültig da sie z.B. Leerzeichen in der Mailadresse als falsch erachten. Folgende Mail Adresse ist aber korrekt: "gta spider"@gmx.de - ob mans glaubt oder nicht ;)

    Ich hab mir deswegen folgendes Pattern geschrieben:

    [autoit]

    StringRegExp($sEmailAddress, ".+@.+\..+")

    [/autoit]

    Das verwirrt jetzt sicher mehr, als das es dir weiterhilft, da es sich ja auch um ein Fließtext handelt, aber ich wollte es zur Vervollständigung noch mal hier hinzufügen :)

    Gruß,
    Spider

  • Naja, man muss ja nicht immer stringregexp nehmen, vor allem nicht, wenn man es nicht vertsteht. Die einfachen String Funktionen tuen es doch i.d.R. auch. Klar, der Code wird länger und langsamer, aber Hauptsache es geht.

    Hier mal was Funktionierendes:

    Spoiler anzeigen
    [autoit]

    $string = "Blub Blub. Morgen ist Weihnachten. Du ereichst den Weihnachtsmann unter [email='weihnachtsmann@coca-cola.de'][/email]. Meine Internetadresse ist http://www.coca-cola.de und meine Telefonnummer die 09000815."

    [/autoit] [autoit][/autoit] [autoit]

    $mailjn = StringInStr ($string,"@")
    $vorat = ""
    $nachat = ""
    $mail = ""
    If $mailjn <> 0 Then
    if $mailjn <> 0 Then
    For $i = 1 To StringLen ($string)
    $zeichen = StringMid ($string,$mailjn - $i,1)
    If $zeichen <> " " Then
    $vorat = $zeichen & $vorat
    Else
    ExitLoop
    EndIf
    Next
    $punkt = 0
    For $i = 1 To StringLen ($string)
    $zeichen = StringMid ($string,$mailjn + $i,1)
    If $zeichen = "." Then $punkt = $punkt + 1
    If $zeichen <> " " And $punkt < 2 Then
    $nachat = $nachat & $zeichen
    Else
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If $vorat <> "" And $nachat <> "" Then
    $mail = $vorat & "@" & $nachat
    $string= StringReplace ($string,$mail,"")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite ($mail & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $webseitejn = StringInStr ($string,"www.")
    $nachwww = ""
    $nachpunkt = ""
    $webseite = ""
    If $webseitejn <> 0 Then
    if $webseitejn <> 0 Then
    For $i = 1 To StringLen ($string)
    $zeichen = StringMid ($string,$webseitejn + $i + 3,1)
    If $zeichen <> "." Then
    $nachwww = $nachwww & $zeichen
    Else
    For $i = 1 To 6 ; 6 ist die maximale Länge der Länderzeichen der Domains (?)
    $zeichen = StringMid ($string,$webseitejn + $i + 3 + StringLen ($nachwww) + 1,1)
    If $zeichen <> "." And $zeichen <> " " Then
    $nachpunkt = $nachpunkt & $zeichen
    Else
    ExitLoop
    EndIf
    Next
    ExitLoop
    EndIf
    Next
    $webseite = "www." & $nachwww & "." & $nachpunkt
    EndIf
    EndIf
    ConsoleWrite ($webseite & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $zahljn = StringLen ($string) + 1
    $zahl = ""
    For $i = 0 To 9
    $zahltm = StringInStr ($string,$i)
    If $zahltm < $zahljn And $zahltm <> 0 Then $zahljn = $zahltm
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if $zahljn <> StringLen ($string) + 1 Then
    For $i = 0 To StringLen ($string)
    $zeichen = StringMid ($string,$zahljn + $i,1)
    If $zeichen <> "." And $zeichen <> " " Then
    $zahl = $zahl & $zeichen
    Else
    ExitLoop
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite ($zahl & @CRLF)

    [/autoit]


    Warscheinlich habe ich nicht alle Eventualitäten beachtet und die Internetadressen werden auch nur erkannt, wenn www. vorsteht, ausßerdem sollte jedes Element (Mail, URL und Nummer) nur einmal vorkommen. Aber das kann man ja nach Belieben anpassen.

  • Dieter, das sieht doch gut aus.
    Vielen Dank.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Folgende Mail Adresse ist aber korrekt: "gta spider"@gmx.de - ob mans glaubt oder nicht ;)

    Ok, das war mir so nicht klar. Ich bin davon ausgegangen, dass im ersten Teil der Adresse Anführungszeichen genauso verboten sind wie @-Zeichen und Leerzeichen, aber so kann man sich irren.

    Hier der Vollständigkeithalber ein Auszug aus wikipedia zum Lokalteil, also alles vor dem @-Zeichen:

    Zitat


    Der Lokalteil muss eine bezüglich „domain“ eindeutige Zeichenkette sein. Diese Zeichenkette darf nach RFC 5322 nur Buchstaben und Zahlen sowie bestimmte weitere Zeichen enthalten: A-Za-z0-9.!#$%&'*+-/=?^_`{|}~. Andere Zeichen, wie zum Beispiel Leerzeichen, können benutzt werden, wenn local part in doppelte Anführungsstriche eingeschlossen wird oder das Zeichen durch einen umgekehrten Schrägstrich (\) maskiert ist ( z. B. ", @, :, ; ). Kommentare können innerhalb von runden Klammern ebenfalls eingefügt werden. Alle Zeichen oberhalb des ASCII-Codes 127, also auch Umlaute, sind generell verboten. Am Anfang und Ende der Zeichenkette darf sich kein Punkt befinden.

    Demnach können sogar maskierte @-Zeichen vor dem eigentlichen @ vorkommen... :rolleyes:

  • Cheater Dieter:

    Danke noch einmal und ich werde heute schauen, wie ich das in mein Script eingearbeitet bekomme, denn es wäre sehr schön, wenn das klappt.
    Habe ja die Feiertage über Zeit, da ich "Zuhause" fest sitze.

    Aber nicht einfach nur einbauen, sondern verstehen so weit es geht, das ist meine Art Hilfe anzunehmen. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl