regex

  • Hallo

    ich muß mit regex einen Text ausschliessen! type="hidden"

    Spoiler anzeigen


    <input type="hidden" name="userUsedAutocompletion" value="false">
    <input id="markt_header_searchPhraseInput" name="keywords" autocomplete="off">

    hier mein Code

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource,'<input id.*?\sname="(.*?)".*?>',3)
    _ArrayDisplay($arrayfilter, "Array Auswertung")
    For $i = 0 To UBound($arrayfilter) -1
    MsgBox(0,"",$arrayfilter[$i])
    next

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

    das klappt soweit, nur bei einigen Seiten gibt es Probleme.
    Ich kann zwar die Suche so aufbauen
    Suche nach

    Spoiler anzeigen
    [autoit]


    $arrayfilter = StringRegExp($sSource,'<input [id|class].*?\sname="(.*?)".*?>',3); aber wie kann ich type="hidden" ausschliessen?

    [/autoit]

    ich muß aber meine Suche so aufbauen
    Suche nach das, das... oder das... aber NICHT nach das, oder das...!
    input id
    input class
    aber nicht
    input type

    wie macht man das?

    Grüße
    Ilse ;)

    • Offizieller Beitrag

    Dann probier mal dieses Pattern: (<input (?!type="hidden").+)
    Der "negative lookahead" schaut vor dem Match nach vorn und vergleicht mit der Ausschlußbedingung: (?!type="hidden")
    Jetzt matchst du natürlich die gesamte Zeile. Du kannst entweder das Pattern noch auf Detailmatches in der Zeile verfeinern oder machst das in einem zweiten Durchlauf separat mit den gefundenen Matches.

  • Hallo Bugfix,

    bin noch immer am probieren.
    Das hat leider nicht geklappt.

    Vielleicht gibt es noch ne andere Lösung:
    Ich möchte nur das Wort "keywords" anzeigen.
    <input brauch ich für die anderen Seiten!
    Hier mal die kpl. Zwischenablage

    Spoiler anzeigen


    <input type="hidden" value="false" name="userUsedAutocompletion" />

    <label for="markt_header_searchPhraseInput">Was</label>
    <input type="text" id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput"
    name="keywords" value="z.B. Laptop" tabindex="1"
    />

    <label>In</label>

    Hier der regexCode

    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource,'<input id.*?\sname="(.*?)".*?>',3)
    _ArrayDisplay($arrayfilter, "Array Auswertung")
    For $i = 0 To UBound($arrayfilter) -1
    MsgBox(0,"",$arrayfilter[$i])
    next

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


    verwende ich <input .*?name="(.*?)".*?> das geht nicht! (hier sollten doch 2 Einträge stehen9
    verwende ich <input id.*?name="(.*?)".*?> das geht auch nicht! (hier sollte 1 Eintrag stehen)

    komm da einfach nicht weiter!


    Grüße
    Ilse ;)

  • Ich verstehe das nicht so ganz, du willst nur das Wort keywords von dem text haben?

    Spoiler anzeigen
    [autoit]

    <input type="hidden" value="false" name="userUsedAutocompletion" />

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

    <label for="markt_header_searchPhraseInput">Was</label>
    <input type="text" id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput"
    name="keywords" value="z.B. Laptop" tabindex="1"
    />

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

    <label>In</label>

    [/autoit]


    was in name=" " steht ?

    ---
    Bin gleich @home und werde dir da was basteln.

  • Hallo tuttifrutti,

    ja, genau nur das Wort keywords
    also das was in Name steht!

    Das ist normalerweise auch kein Problem.
    Nur im Regex sollte <input mitverwendet werden.
    Das brauche ich für andere Suchmuster!

    ...und genau das bekomme ich nicht hin!


    Liebe Grüße
    Ilse ;)

  • Meinst du es so ?

    [autoit]

    #include <Array.au3>
    $text = "'<input type='hidden' value='false' name='userUsedAutocompletion' /> " & _
    "<label for='markt_header_searchPhraseInput'>Was</label>"& _
    "<input type='text' id='markt_header_searchPhraseInput' name='alex' class='markt_header_searchPhraseInput markt_header_searchTextInput'"& _
    "name='keywords' value='z.B. Laptop' tabindex='1'/>"& _
    "<label>In</label>"

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

    $array = StringRegExp($text, "name='(.*?)'", 3)
    for $i = 0 to UBound($array) - 1
    msgbox(0, "" & $i, $array[$i])
    Next

    [/autoit]

    Das mit dem input mitverwenden verwirrt mich noch, weil ich das nicht genau verstehe was du damit möchtest.

  • ...nee leider nicht!

    Das mit dem input sollte drin sein,
    sonst stimmen die anderen Ergebnisse nicht!

    $arrayfilter = StringRegExp($sSource,'<input .*?name="(.*?)".*?>',3)

    Das Problem:

    Spoiler anzeigen


    Es gibt Felder mit:

    <input id
    <input type
    <input class

    ...und die haben auch Felder mit name=

    Schau dir bitte nochmal mein Beispiel an,
    da kann man den Fehler am besten nachvollziehen.
    Obwohl <input .*? benutzt wird, sollten alle arrays angezeigt werden.

    Grüße
    Ilse ;)

  • Habe mir grade den ersten post nomma durchgelesen.
    Hoffe du meinst des so X(

    [autoit]

    #include <Array.au3>
    $text = "'<input type='hidden' value='false' name='userUsedAutocompletion' /> " & _
    "<label for='markt_header_searchPhraseInput'>Was</label>" & _
    "<input class='Peter' name='Irgendwas' color='black' />" & _
    "<label>In</label>" & _
    "<input id='alex' value=`15' name='Awesome' />"

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

    $array = StringRegExp($text, '<(?i)input class=(.*?) (?i)/>', 3)
    For $i = 0 To UBound($array) - 1
    ConsoleWrite("Input class -> " & $array[$i] & @CRLF)
    Next
    $array = StringRegExp($text, '<(?i)input id=(.*?) (?i)/>', 3)
    For $i = 0 To UBound($array) - 1
    ConsoleWrite("Input id -> " & $array[$i] & @CRLF)
    Next

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

    ;~ $array1 = StringRegExp($array[$i], "name='(.*?)'",3)
    ;~ MsgBox(0, $i, $array1)

    [/autoit]
  • Hallo tuttifrutti,

    leider kein Ergebnis!

    Kopiere bitte diesen Quelltext in die Zwischenablage

    Spoiler anzeigen
    [autoit]


    <input type="hidden" name="userUsedAutocompletion" value="false">
    <label for="markt_header_searchPhraseInput">Was</label>
    <input id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput ac_input" type="text" tabindex="1" value="z.B. Laptop" name="keywords" autocomplete="off" style="color: black;">
    <label>In</label>

    [/autoit]

    2. Starte dein Script

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    ;$arrayfilter = StringRegExp($sSource,'<input .*?name="(.*?)".*?>',3)
    $arrayfilter = StringRegExp($sSource,'<(?i)input name=(.*?) (?i)/>',3)
    ;$arrayfilter = StringRegExp($sSource,'name=(.*?)', 3)
    _ArrayDisplay($arrayfilter, "Array Auswertung")
    For $i = 0 To UBound($arrayfilter) -1
    MsgBox(0,"",$arrayfilter[$i])
    next

    [/autoit]

    Das Ergebnis sollte
    keywords
    sein!

    RegEx muß <input enthalten damit
    auch ein Ergebnis bei anderen Seiten erfolgt!

    Das ist das Problem ;)

    Liebe Grüße
    Ilse ;)

  • Soweit bin ich nun gekommen, habe nun keine Zeit/Lust mehr ^^
    Schaue vll morgen nomma vorbei.

    [autoit]

    #include <Array.au3>
    ;~ $text = "'<input type='hidden' value='false' name='userUsedAutocompletion' /> " & _
    ;~ "<label for='markt_header_searchPhraseInput'>Was</label>" & _
    ;~ "<input class='Peter' name='Irgendwas' color='black' />" & _
    ;~ "<label>In</label>" & _
    ;~ "<input id='alex' value=`15' name='Awesome' />"
    #cs
    <input type="hidden" name="userUsedAutocompletion" value="false">
    <label for="markt_header_searchPhraseInput">Was</label>
    <input id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput ac_input" type="text" tabindex="1" value="z.B. Laptop" name="keywords" autocomplete="off" style="color: black;">
    <label>In</label>
    #ce
    $text = ClipGet()
    $array = StringRegExp($text, '<(?i)input id(.*?)name="(.*?)"(?i)', 3)
    For $i = 0 To UBound($array) - 1
    ConsoleWrite("Input id -> " & $array[$i] & @CRLF)
    Next
    $array = StringRegExp($text, '<(?i)input id=(.*?)(?i)>', 3)
    ;~ $array = StringRegExp($text , '<(?i)input(.*?)name="(.*?)"(?i)',3)
    For $i = 0 To UBound($array) - 1
    ConsoleWrite("Input alles -> " & $array[$i] & @CRLF)
    Next

    [/autoit]
  • Guten Morgen Bugfix,

    vielleicht ist es so etwas übersichtlicher.
    Das ist der Quelltext

    Spoiler anzeigen


    <script majax:evalscript="global" type="text/javascript">
    <div id="markt_header_logoBox">
    <div id="markt_header_loginBox">
    <div class="markt_header_fbLike">
    <div id="markt_header_searchBox">
    <div id="markt_header_searchBoxTop">
    <div id="markt_header_searchBoxBottom">
    <form action="http://www.seite.de/suche.htm" method="post">
    <input type="hidden" name="userUsedAutocompletion" value="false">
    <label for="markt_header_searchPhraseInput">Was</label>
    <input id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput ac_input" type="text" tabindex="1" value="z.B. Laptop" name="keywords" autocomplete="off">
    <label>In</label>
    <input class="markt_header_searchCategoryInputDummy markt_header_searchSelectInput" type="text" tabindex="2" value="Allen Kategorien" readonly="readonly" autocomplete="off">
    <input class="markt_header_searchCategoryIdInput" type="hidden" value="" name="categoryId" readonly="readonly" autocomplete="off">
    <ul class="markt_header_searchCategoryMenu">
    <label for="markt_header_searchRegionInput">Wo</label>
    <input id="markt_header_searchRegionInput" class="markt_

    Ich benötige nur das Wort keywords von diesem Bereich
    value="z.B. Laptop" name="keywords" autocomplete="off">

    So, nochmal das Problem:
    Es gibt mehrere Quellcodes. Alle Quellcodes besitzen aber das gleiche Muster
    und zwar sie fangen alle mit
    <input an, dann folgen div. Felder und dann kommt name="..." und den Wert benötige
    ich von allen Seiten.

    Hier nochmal bildlich dargestellt.
    autoit.de/wcf/attachment/13763/
    die erste input Zeile sollte nicht ausgewertet werden
    aber die zweite. Da ist auch name= drin!

    Dieser code zeigt im Array 2 Ergebnisse
    gewünscht wäre aber nur ein Ergebnis Row1 Keywords

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    ;$arrayfilter = StringRegExp($sSource,'<input .*?name="(.*?)".*?>',3)
    ;$arrayfilter = StringRegExp($sSource,'<(?i)input name=(.*?) (?i)/>',3)
    $arrayfilter = StringRegExp($sSource, '<(?i)input id(.*?)name="(.*?)"(?i)', 3)
    _ArrayDisplay($arrayfilter, "Array Auswertung")

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

    Hoffe ich konnte das Problem auf den Punkt bringen

    Liebe Grüße
    Ilse ;)

    • Offizieller Beitrag

    den Musterquellcode und färbe die Elemente ein, die du als Ergebnis willst


    Ist denn das sooo schwer??? Jetzt hast du wieder mit Worten beschrieben, was du dir vorstellst - und damit kann ich leider nicht viel anfangen.
    Dein Bild mußt du erst noch erklären, blau, gelb.. :D

  • Hallo Bugfix,

    hatte ich gemacht, aber im Spoiler wurde es nicht angezeigt! ?(

    Spoiler anzeigen


    <script majax:evalscript="global" type="text/javascript">
    <div id="markt_header_logoBox">
    <div id="markt_header_loginBox">
    <div class="markt_header_fbLike">
    <div id="markt_header_searchBox">
    <div id="markt_header_searchBoxTop">
    <div id="markt_header_searchBoxBottom">
    <form action="http://www.Site.de/suche.htm" method="post">
    <input type="hidden" name="userUsedAutocompletion" value="false">
    <label for="markt_header_searchPhraseInput">Was</label>
    <input id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput ac_input" type="text" tabindex="1" value="z.B. Laptop" name="keywords" autocomplete="off">
    <label>In</label>
    <input class="markt_header_searchCategoryInputDummy markt_header_searchSelectInput" type="text" tabindex="2" value="Allen Kategorien" readonly="readonly" autocomplete="off">
    <input class="markt_header_searchCategoryIdInput" type="hidden" value="" name="categoryId" readonly="readonly" autocomplete="off">
    <ul class="markt_header_searchCategoryMenu">
    <label for="markt_header_searchRegionInput">Wo</label>
    <input id="markt_header_searchRegionInput" class="markt_

    ...und nochmal ---so jetzt ist es eingefärbt. (hatte von Scite Quellcode kopiert), egal

    Bild Erklärung

    Gelb ist bei allen Seiten das gleiche Suchmuster
    Blau wird hier gezeigt obwohl es nicht gesucht wird <input id
    Roter Pfeil = in dieser Zeile kommt nochmal name= vor und das ist das richtige Feld! :P

    ;) Ilse

    P.S. Ich brauche nur 1 Ergebnis und das heißt Keywords!

    • Offizieller Beitrag

    Also mal als Kurzfassung:
    Wenn eine Zeile mit "<input" beginnt UND das Feld "name=" enthalten ist, dann möchtest du den Begriff hinter "name=" als Ergebnis haben. Ist das korrekt?

    Edit:
    Ich sehe gerade, das würde ja auch auf "userUsedAutocompletion" und "categoryId" zutreffen.
    Mal sehen, ob das mit einem Aufruf geht.

  • ja, das ist teilweise korrekt!

    <input id ..... name="keywords" (korrekt)
    <input type"hidden"......name="text"(falsch)

    Ich brauche als Ergebnis Begriff hinter "name="
    halt nur für bestimmte <input Felder!

    und genau das war ja das Problem:
    ich benötige ein Suchpattern das z.B. sagt
    suche <input id....name="richtig" oder <input type="text"....name="richtig" aber nicht <input type="hidden"....name="falsch"
    und jede Zeile enthält als Ergebnis name="richtiger Text" aber mit unterschiedlichem <input
    huh...

    Grüße
    Ilse ;)

    • Offizieller Beitrag

    OK, mit dem folgenden Pattern und Flag 3 bekommst du im Array nur "keywords" aus dem Quelltext.
    Voraussetzung, dass das mit anderem Source auch klappt ist, was zwischen "type=hidden" und "name=" steht.
    Nach dem vorgegeben Source folgt "name" direkt auf "type=hidden" oder es steht "value="" " dazwischen (In den Zeilen, die "name=" enthalten aber nicht ins Ergebnis sollen). Sollte das in anderer Source nicht so sein, muß dort mit Oder-Verknüpfungen im Optionalzweig [ (?:value="" )? ] angepaßt werden.
    Hier das Pattern: (?<!type="hidden" (?:value="" )?)(?:name=")([^"]+)

  • He Bugfix,

    klappt leider nicht!
    Meine Zwischenablage

    Spoiler anzeigen


    <script majax:evalscript="global" type="text/javascript">
    <div id="markt_header_logoBox">
    <div id="markt_header_loginBox">
    <div class="markt_header_fbLike">
    <div id="markt_header_searchBox">
    <div id="markt_header_searchBoxTop">
    <div id="markt_header_searchBoxBottom">
    <form action="http://www.seite.de/suche.htm" method="post">
    <input type="hidden" name="userUsedAutocompletion" value="false">
    <label for="markt_header_searchPhraseInput">Was</label>
    <input id="markt_header_searchPhraseInput" class="markt_header_searchPhraseInput markt_header_searchTextInput ac_input" type="text" tabindex="1" value="z.B. Laptop" name="keywords" autocomplete="off">
    <label>In</label>
    <input class="markt_header_searchCategoryInputDummy markt_header_searchSelectInput" type="text" tabindex="2" value="Allen Kategorien" readonly="readonly" autocomplete="off">
    <input class="markt_header_searchCategoryIdInput" type="hidden" value="" name="categoryId" readonly="readonly" autocomplete="off">
    <ul class="markt_header_searchCategoryMenu">
    <label for="markt_header_searchRegionInput">Wo</label>
    <input id="markt_header_searchRegionInput" class="markt_

    Das Pattern

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource, '(?<!type="hidden" (?:value="" )?)(?:name=")([^"]+)', 3)
    _ArrayDisplay($arrayfilter, "Array Auswertung")

    [/autoit]

    ...bin bald am Ende...

    Ilse :huh: