regexp inhalt der html attribute auslesen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • regexp inhalt der html attribute auslesen

    Hallo!

    Kann mir jemand bzg. RegExp weiterhelfen. Ich versuche den Inhalt von einem bestimmten
    HTML Attribut auszulesen. Doch irgendwie will mir das nicht so recht gelingen.
    PHP-Code:
    $str '<form action="blah.php" method="get"></form>';

    function 
    getAttributeValue($str$attr) {
        
    $retval '';

        
    $res preg_match(
            
    sprintf(
                
    '/%s\\s?=\\s?["\\\']?(.*)["\\\']?/is',
                
    $attr
            
    ),
            
    $str,
            
    $matches
        
    );

        if (
    $res) {
            
    print_r($matches);
        }
    }

    getAttributeValue($str'method'); 
    Das momentane Ergebnis ist:
    PHP-Code:
    Array
    (
        [
    0] => method="get"></form>
        [
    1] => get"></form>

    Da RegExp wieder mal zu gierig ist, benutze ich noch zusätzlich den [FONT=courier new]U[/FONT] modifier.
    Code:
    '/%s\s?=\s?["\\']?(.*)["\\']?/isU',
    Doch dann erhalte ich folgendes als Ergebnis.
    PHP-Code:
    Array
    (
        [
    0] => method=
        [
    1] => 

    Was mache ich nicht richtig.
    Zuletzt geändert von schlimmerfinger; 27.06.2005, 12:04.
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
    PHP Sicherheit
    PHPUnit[1-2]
    Professionelle Softwareentwicklung mit PHP 5
    Professionelle PHP 5-Programmierung

  • #2
    Die ? bedeuten, dass das MINIMUM 0 ist, d.h. es ist optional

    Ersetze die ? die nach deinen Zeichenklassen kommen mal durch ein + -> das sagt, es MUSS mindestens 1x vorkommen, sonst matcht der RegEx nicht....
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      Original geschrieben von Shurakai
      Die ? bedeuten, dass das MINIMUM 0 ist, d.h. es ist optional

      Ersetze die ? die nach deinen Zeichenklassen kommen mal durch ein + -> das sagt, es MUSS mindestens 1x vorkommen, sonst matcht der RegEx nicht....
      Danke für die Antwort. Das die Hochkommata/Anführungszeichen optional sind,
      ist absichtlich. Ich will mir jede möglichkeit offen halten. Sprich
      Code:
      $str[] = '<form action = "blah.php" method="get"></form>';
      $str[] = '<form action =blah.php method="get"></form>';
      $str[] = '<form action=\'blah.php\' method="get"></form>';
      $str[] = '<form 
      action = \'blah.php\'
      method="get"></form>';
      Sry war mein Fehler hätte es vorher erwähnen sollen.
      Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
      PHP Sicherheit
      PHPUnit[1-2]
      Professionelle Softwareentwicklung mit PHP 5
      Professionelle PHP 5-Programmierung

      Kommentar


      • #4
        probier mal
        Code:
        #action\s*=\s*(\'|\")?(?(1)(.*?)\1|([^ >]*))#is
        funktioniert mit deinen 4 teststrings da oben.

        einziges problem dürfte sein, daß, sollten " oder ' verwendet wurden sein, der inhalt in \2, sonst in \3 steht ... aber naja.
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          Original geschrieben von derHund
          probier mal
          Code:
          #action\s*=\s*(\'|\")?(?(1)(.*?)\1|([^ >]*))#is
          funktioniert mit deinen 4 teststrings da oben.

          einziges problem dürfte sein, daß, sollten " oder ' verwendet wurden sein, der inhalt in \2, sonst in \3 steht ... aber naja.
          Hat geklappt. Danke. Zwar ist der Inhlat bei mir immer in \3 gewesen aber nun gut.
          Könntest du mir bitte diesen Teil erklären
          Code:
          ([^ >]*)
          Ich steig da jetzt nicht dahinter.
          Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
          PHP Sicherheit
          PHPUnit[1-2]
          Professionelle Softwareentwicklung mit PHP 5
          Professionelle PHP 5-Programmierung

          Kommentar


          • #6
            Original geschrieben von derHund
            einziges problem dürfte sein, daß, sollten " oder ' verwendet wurden sein, der inhalt in \2, sonst in \3 steht ... aber naja.
            dann pack ' und " doch in eine zeichenklasse, statt in runde klammern - dann sollte ja keine backreference erzeugt werden.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Original geschrieben von wahsaga
              dann pack ' und " doch in eine zeichenklasse, statt in runde klammern - dann sollte ja keine backreference erzeugt werden.
              Code:
              #%s\s*=\s*(?(?=['\"]?)(\S.*)['\"]|([^\s]*))#isU
              Die bedingung ist nun immer wahr!? Warum.
              Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
              PHP Sicherheit
              PHPUnit[1-2]
              Professionelle Softwareentwicklung mit PHP 5
              Professionelle PHP 5-Programmierung

              Kommentar


              • #8
                So in großem und Ganzen denke ich das es weitesgehend funktioniert.
                Code:
                $str = '<form action=\'blah.php\' method=get></form>';
                
                function getAttributeValue($str, $attr) {
                    $retval = '';
                    $pattern = sprintf(
                            "#%s\s*=\s*(?(?=['\"])['\"](\S*)['\"]|([^\s>\/>]*))#is",
                            $attr
                    );
                
                    if (preg_match($pattern, $str, $matches) > 0) {
                        print_r($matches);
                
                        if (isset($matches[2]) && !empty($matches[2])) {
                            $retval = $matches[2];
                        } else if (isset($matches[1]) && !empty($matches[1])) {
                            $retval = $matches[1];
                        }
                
                        $retval = str_replace('"', '', $retval);
                        $retval = str_replace("'", '', $retval);
                    }
                    
                    return trim($retval);
                }
                
                print getAttributeValue($str, 'action');
                Zuletzt geändert von schlimmerfinger; 27.06.2005, 13:53.
                Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
                PHP Sicherheit
                PHPUnit[1-2]
                Professionelle Softwareentwicklung mit PHP 5
                Professionelle PHP 5-Programmierung

                Kommentar


                • #9
                  Original geschrieben von schlimmerfinger
                  Hat geklappt. Danke. Zwar ist der Inhlat bei mir immer in \3 gewesen aber nun gut.
                  Könntest du mir bitte diesen Teil erklären
                  Code:
                  ([^ >]*)
                  Ich steig da jetzt nicht dahinter.
                  Die Zeichenklasse ist negiert (verneint) durch das Circumflex am Anfang -> es besagt, dass alle Zeichen dort stehen dürfen außer das Leerzeichen bzw. das Größer-Als-Zeichen. Außerdem dürfen davon minimal 0, maximal unendlich viele Zeichen vorkommen.
                  Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                  var_dump(), print_r(), debug_backtrace und echo.
                  Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                  Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                  Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                  Kommentar


                  • #10
                    dann pack ' und " doch in eine zeichenklasse, statt in runde klammern - dann sollte ja keine backreference erzeugt werden.
                    ich brauche das subpattern ja, .... einerseits, um das conditional subpattern verwenden zu können, andererseits um per backreference auf das passende, zweite ' oder " zu testen ...
                    Die Zeit hat ihre Kinder längst gefressen

                    Kommentar

                    Lädt...
                    X