Dieter72: RegEx -> alle Input type="text" finden die nicht readonly sind

Hallo,

ich möchte alle Text-Eingabefelder eines Formulars mit regex ermitteln, die nicht auf readonly stehen.
Meine bisherigen regex-Versuche sind bis zu dem Punkt Input-Felder finden gekommen:
preg_match_all('/(\<input.*type\s?\=\s?"text".*>)/', $siteCode,$matches)
Mit diesem Suchpattern hoffe ich alle einzeiligen Eingabe-Felder eines Formulars zu ermitteln.
Das Problem hierbei ist schon, das ich nicht weiss, ob meine Expression so sinnvoll ist...
Mein zweites Problem ist, das ich aber sämtliche Input-Felder die auf "readonly" stehen, ausschliessen möchte.
Da ich trotz Eigenbemühungen nicht wirklich weiterkomme, bitte ich um mithilfe.

Gruss
Dieter

  1. Moin

    preg_match_all('/(\<input.*type\s?\=\s?"text".*>)/', $siteCode,$matches)
    Mit diesem Suchpattern hoffe ich alle einzeiligen Eingabe-Felder eines Formulars zu ermitteln.
    Das Problem hierbei ist schon, das ich nicht weiss, ob meine Expression so sinnvoll ist...

    relativ umständlich

    preg_match_all('~<input (.*?)>~')

    <- liefert alle Inputs zurück

    Mein zweites Problem ist, das ich aber sämtliche Input-Felder die auf "readonly" stehen, ausschliessen möchte.

    preg_match_all('~<input (((?!readonly).)*?)>~')

    Schließt Inputs aus, die readonly enthalten.

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    ### Henry L. Mencken ###
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ## Viktor Frankl ###
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Moin

      preg_match_all('/(\<input.*type\s?\=\s?"text".*>)/', $siteCode,$matches)

      relativ umständlich

      preg_match_all('~<input (.*?)>~')

      <- liefert alle Inputs zurück

      sorry, ich überlas, dass du alle teyxt Inputy haben möchtest. Dann selbstverständlich:

      <input ((type.*?text).*?)>

      preg_match_all('~<input (((?!readonly).)*?)>~')

      und <input (type.*?text((?!readonly).)*?)>

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ## Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Danke, werde ich jetzt erstmal einbauen und durchtesten!

        Vielen Dank für die Hilfe!

        Gruss
        Dieter

        Moin

        preg_match_all('/(\<input.*type\s?\=\s?"text".*>)/', $siteCode,$matches)

        relativ umständlich

        preg_match_all('~<input (.*?)>~')

        <- liefert alle Inputs zurück

        sorry, ich überlas, dass du alle teyxt Inputy haben möchtest. Dann selbstverständlich:

        <input ((type.*?text).*?)>

        preg_match_all('~<input (((?!readonly).)*?)>~')

        und <input (type.*?text((?!readonly).)*?)>

        Gruß Bobby

    2. Hallo nochmal,

      zuerst Danke für deine Hilfe...

      Moin

      preg_match_all('/(\<input.*type\s?\=\s?"text".*>)/', $siteCode,$matches)
      Mit diesem Suchpattern hoffe ich alle einzeiligen Eingabe-Felder eines Formulars zu ermitteln.
      Das Problem hierbei ist schon, das ich nicht weiss, ob meine Expression so sinnvoll ist...

      relativ umständlich

      preg_match_all('~<input (.*?)>~')

      <- liefert alle Inputs zurück

      Das liefert mir aber auch die Inputs zurück, die z.B. Passwortfelder sind, oder?
      Ich versuche ja alle einzeiligen Text-Eingabefelder zu ermitteln die nicht readonly sind, wobei hierbei egal sein soll, wie diese deklariert wurden.

      Beispiel:

        
      a: <input name="vorname" type="text" size="30" maxlength="30">  
      b: <input type="text" id="vorname" size="30" maxlength="30">  
      c: <input style="width:100%" type="text" name="vorname">  
      d: <input name="vorname" type=text>  
      e: <input name="vorname" type="text" readonly="readonly">  
      f: <input name="vorname" type="password">  
      
      

      Hierbei sollte a-d gefunden und e,f ausgeschlossen werden.

      Mein zweites Problem ist, das ich aber sämtliche Input-Felder die auf "readonly" stehen, ausschliessen möchte.

      preg_match_all('~<input (((?!readonly).)*?)>~')

      Schließt Inputs aus, die readonly enthalten.

      Gruß Bobby

      Gruss
      Dieter

      1. Moin

        Hierbei sollte a-d gefunden und e,f ausgeschlossen werden.

        Ich habe es noch gemerkt gehabt und schon vor deiner Antwort korrigiert... Du hast ja recht. ;)

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        ### Henry L. Mencken ###
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ## Viktor Frankl ###
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      2. @@Dieter72:

        nuqneH

        preg_match_all('~<input (.*?)>~')
        <- liefert alle Inputs zurück
        Das liefert mir aber auch die Inputs zurück, die z.B. Passwortfelder sind, oder?

        Das schon, aber du und alle, diesher geantwortet haben, habt eins völlig übersehen:

        Ich versuche ja alle einzeiligen Text-Eingabefelder zu ermitteln die nicht readonly sind, wobei hierbei egal sein soll, wie diese deklariert wurden.

        g: <input name="vorname">
        h: <input name="vorname" readonly>

        g sollte gefunden und h ausgeschlossen werden, denn beides ist völliq äquivalent zu d bzw. e:

        d: <input name="vorname" type=text>
        e: <input name="vorname" type="text" readonly="readonly">

        Die Angabe von type="text" ist in HTML optional.

        Und wie willst du mit type="email", type="tel" usw. verfahren? Auch das sind einzeilige Text-Eingabefelder, die keine Passwortfelder sind.

        Wozu brauchst du das Ganze überhaupt? Zum Ändern von bestehendem Quelltext?

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  2. preg_match_all('/(\<input.*type\s?\=\s?"text".*>)/', $siteCode,$matches)
    Mit diesem Suchpattern hoffe ich alle einzeiligen Eingabe-Felder eines Formulars zu ermitteln.
    Das Problem hierbei ist schon, das ich nicht weiss, ob meine Expression so sinnvoll ist...

    Die Reihenfolge und was so vorkommen kann, ist vielseitig. Entweder man kann es einfach halten, da besteht in deinem Fall durchaus eine Chance oder ein anderes Werkzug muß her.

    Du solltest auf jeden Fall dafür sorgen, daß deine Suchmuster auf möglichst kurze Treffer zielen. .*> kann auf sehr viel zutreffen u.U. auch auf irgendwas>irgendwas> also über mehrer Tags gehen. Ein beliebiges optionales Zeichen, welches kein > ist schafft ggf. Abhilfe. Eventuell auch die Modifier beachten.

    Mein zweites Problem ist, das ich aber sämtliche Input-Felder die auf "readonly" stehen, ausschliessen möchte.

    Um mit regex Zeichenketten nicht zu finden mußt Du Lookarounds bemühen.

  3. alle Text-Eingabefelder eines Formulars mit regex ermitteln, die nicht auf readonly stehen.

    Würde das etwas genauer angehn. Alle input...

    <input\s+

    Aber keine readonly. Z.B. mit einem negativen lookahead voraussehen:

    (?![^>]*readonly)

    type="text", type=text... mit einem positiven lookahead prüfen:

    (?=[^>]*type\s*=\s*(?:["\']\s*)?text)

    So könnte die regex-wurst dann so aussehn:

    <input\s+(?![^>]*readonly)(?=[^>]*\btype\s*=\s*(?:["\']\s*)?text)[^>]*>

    \b ist eine Wortgrenze (zero-width) und \s ein shorthand für [ \t\r\n\f] (whitespace characters)

    Wie auch immer, viel Freude beim rexeggen :-)