Uwe Wanzleben: Schalter für RegExpr

Hallo,

ich habe mal eine Frage zu RegExpr.

Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.

Dazu habe ich mir folgendes gebastelt:

sub xxx
{

my $inhalt = shift; #Quelltext
    $inhalt =~ s/\r/\s/gi;
    $inhalt =~ s/\n/\s/gi;

my $ParamValsearch = qq{
        '[^"]*" |               # a string in double quotes
        '[^']*' |               # a string in single quotes
        [^\s>]*                 # or anything terminated by ws or >
    };
    my $ParamValmatch = qq{
        "([^"]*)" |             # a string in double quotes
        '([^']*)' |             # a string in single quotes
        ([^\s>]*)               # or anything terminated by ws or >
    };

my $HREFsearch =qq{
        <a
        (?:\s+[-\w]+\s*=\s*(?:$ParamValsearch))*?       # any parameters
        (?:\s+href\s*=\s*(?:$ParamValmatch))           # href
    };
    my $IMGsearch =qq{
        <img
        (?:\s+[-\w]+\s*=\s*(?:$ParamValsearch))*?       # any parameters
        (?:\s+src\s*=\s*(?:$ParamValmatch))           # img src
    };

my $URLsearch = $HREFsearch."|".$IMGsearch;
    my(@links) = ($inhalt =~ /$URLsearch/sgix); # Version 1
    #my(@links) = ($inhalt =~ /$URLsearch/smgixoc); # Version 2
    return @links;
}

Nun, das funktioniert eigentlich Klasse!!!
Aber: Bei einer Datei, die sehr groß ist und teilweise lange Zeilen beinhaltet, kommt etwas zustande wie:

Link:  %22/grafik.gif

das %22 ist ein encodiertes '"', wie ich herausfand. Aber ich weiß nicht, warum er das zum URL hinzufügt. Schließlich soll das laut
$ParamValsearch/$ParamValmatch eine Grenze dazu sein.

Noch ein Hinweis:
Version 1 macht in der betreffenden Seite weniger solcher Fehler als Version 2 !!! Bei Version 2 treten zusätzlich abgeschnittene URLs auf.

Mache ich grundsätzlich etwas falsch bzw. welchen Schalter soll ich genau nehmen.

Danke!

Uwe

  1. Hi nochmal,

    /mgix funktioniert jetzt!!!

    Aber warum?

    Uwe

    1. /mgix funktioniert jetzt!!!

      leider doch nicht.

      Uwe

  2. Hallo,

    ich habe mal eine Frage zu RegExpr.

    Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.

    Du suchst vermutlich das Modul HTML::Parser;

    Struppi.

    1. Halihallo Struppi und Uwe

      ich habe mal eine Frage zu RegExpr.

      Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.

      Du suchst vermutlich das Modul HTML::Parser;

      oder HTML::LinkExtor; basiert auf HTML::Parser, ist für diese konkrete Aufgabenstellung
      vielleicht einfacher zu verwenden.

      Viele Grüsse

      Philipp

      1. Halihallo Struppi und Uwe

        ich habe mal eine Frage zu RegExpr.

        Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.

        Du suchst vermutlich das Modul HTML::Parser;

        oder HTML::LinkExtor; basiert auf HTML::Parser, ist für diese konkrete Aufgabenstellung
        vielleicht einfacher zu verwenden.

        Danke Euch, sehe ich mir mal an!

      2. Hi,

        oder HTML::LinkExtor; basiert auf HTML::Parser, ist für diese konkrete Aufgabenstellung
        vielleicht einfacher zu verwenden.

        das funktioniert rel. gut. Relativ heißt, sowas:

        <a href="b_extranet.html"  onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">

        kann der NICHT auflösen!
        Ich würde hier erwarten:

        Link: b_extranet.html

        Schade!
        Da funktioniert meine Version besser!

        1. Halihallo Uwe

          das funktioniert rel. gut. Relativ heißt, sowas:

          <a href="b_extranet.html"  onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">

          kann der NICHT auflösen!
          Ich würde hier erwarten:

          Link: b_extranet.html

          dann lass mal folgendes laufen:

          <code>
          use HTML::LinkExtor;

          my $test = '<a href="b_extranet.html"  onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">';

          $p = HTML::LinkExtor->new(&cb);
          sub cb {
             my($tag, %links) = @_;
             while ( my ($n,$v) = each %links ) {
                print 'Link: '.$v."\n";
             }
          }
          $p->parse($test);
          </code>

          also bei mir funktionierts ;)
          oder was soll daran falsch sein?

          Viele Grüsse

          Philipp

          1. Halihallo Uwe

            das funktioniert rel. gut. Relativ heißt, sowas:

            <a href="b_extranet.html"  onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">

            kann der NICHT auflösen!
            Ich würde hier erwarten:

            Link: b_extranet.html

            dann lass mal folgendes laufen:

            <code>
            use HTML::LinkExtor;

            my $test = '<a href="b_extranet.html"  onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">';

            $p = HTML::LinkExtor->new(&cb);
            sub cb {
               my($tag, %links) = @_;
               while ( my ($n,$v) = each %links ) {
                  print 'Link: '.$v."\n";
               }
            }
            $p->parse($test);
            </code>

            also bei mir funktionierts ;)
            oder was soll daran falsch sein?

            Ich habe es ähnlich gemacht:

            sub link_resolve
             {
              my $inhalt = shift;
              #$inhalt =~ s/\r/\s/gi;
              #$inhalt =~ s/\n/\s/gi;

            my $p = HTML::LinkExtor->new(&callback);

            # Set up a callback that collect image links
              my @links = ();
              sub callback {
                 my($tag, %attr) = @_;
                 push(@links, values %attr);
              }

            $p->parse($inhalt);

            return @links;
                     }

            Der Unterschied ist nur, daß ich den gesamten Code in $inhalt habe und die Links als Array @links speicher.
            Bei mir löst er das mit LinkExtor nicht auf.
            Meine RegExpr. dagegen schaffen es.

            Uwe