in reply to Parsing ASP files

Yup, i'm pretty sure you'll have to preprocess

You can glean some regexes from http://search.cpan.org/~johnd/ASP4-1.073/

http://cpansearch.perl.org/src/JOHND/ASP4-1.073/lib/ASP4/PageParser.pm

#!/usr/bin/perl -- use strict; use warnings; my $asp = <<'__HTML__'; <input value="abc" /> abc &nbsp; abc <% abc ( '<input value="abc" /> abc &nbsp; abc <span> %>', $abc ); %> __HTML__ use HTML::Tree; my $t = 'HTML::TreeBuilder'->new; $t->ignore_unknown(0); $t->parse( $asp ); $t->dump; print "\n\n"; $asp =~ s{ <% ((?: '[^']+' | "[^"]+' | \$?[\w\s\(\);,]+ | [^%]+ )+) %> }{ my $content = $1; HTML::Entities::encode_entities( $content ); qq'<yoASP content="$content">' }gsex; $t->parse( $asp ); $t->dump; print "\n\n"; #~ and reverse it $asp =~ s/<yoASP content="([^"]+)">/ my $content = $1; HTML::Entities::decode_entities( $content ); $content; /gsei; print "$asp\n\n"; __END__ <html> @0 (IMPLICIT) <head> @0.0 (IMPLICIT) <body> @0.1 (IMPLICIT) <input value="abc" /> @0.1.0 " abc á abc <% abc ( '" <input value="abc" /> @0.1.2 " abc á abc " <span> @0.1.4 " %>', $abc ); %>" <html> @0 (IMPLICIT) <head> @0.0 (IMPLICIT) <body> @0.1 (IMPLICIT) <input value="abc" /> @0.1.0 " abc á abc <% abc ( '" <input value="abc" /> @0.1.2 " abc á abc " <span> @0.1.4 " %>', $abc ); %> " <input value="abc" /> @0.1.4.1 " abc á abc " <yoasp content=" abc ( &#39;&lt;input value=&quot;abc&quot; /&gt +; abc &amp;nbsp; abc &lt;span&gt; %&gt;&#39;, $abc ); "> @0.1.4.3 <input value="abc" /> abc &nbsp; abc abc ( '<input value="abc" /> abc &nbsp; abc <span> %>', $abc );

Replies are listed 'Best First'.
Re^2: Parsing ASP files
by thewebsi (Scribe) on Jan 26, 2012 at 04:57 UTC

    Awesome!

    The test script is now working great:

    #!/usr/bin/perl use HTML::PullParser; use HTML::Entities; my $doc = <<'EOF'; my %options = (); <input value="abc" /> abc &nbsp; abc <% abc ( '<input value="abc" /> abc &nbsp; abc <span> %>', $abc ); %> EOF $doc =~ s{ <% ((?: '[^']+' | "[^"]+' | \$?[\w\s\(\);,]+ | [^%]+ )+) %> }{ my $content = $1; HTML::Entities::encode_entities ( $content ); qq'<asp_pp content="$content">' }gsex; foreach ( qw{ start text default } ) { $options{$_} = "'$_', text, tagname, attr"; } my $p = HTML::PullParser->new ( doc => $doc, %options ); my $output = ""; while ( my $token = $p->get_token() ) { my $text = $token->[1]; $text =~ s|abc|<b>abc</b>|g if $token->[0] eq 'text'; $text = "<%$token->[3]->{content}%>" if $token->[0] eq 'start' and $token->[2] eq 'asp_pp'; $output .= $text; } print $output;

      Looks like I spoke too soon.

      For anyone else attempting something similar, the above code had a flaw illustrated by the last line I added to the $doc test string below. The solution I came up with essentially amounts to using a more benign format for the temporary replacement string used to hide ASP code from HTML::Parser:

      #!/usr/bin/perl use HTML::PullParser; use HTML::Entities; my $doc = <<'EOF'; my %options = (); <input value="abc" /> abc &nbsp; abc <% abc ( '<input value="abc" /> abc &nbsp; abc <span> %\>', $abc ); %> <input value="<%= $abc %>" abc /> EOF $doc =~ s/<%(.*?)%>/ my $content = $1; HTML::Entities::encode_entities ( $content ); qq'[[asp_pp"$content"asp_pp]]' /gsex; foreach ( qw{ text default } ) { $options{$_} = "event, text, is_cdata"; } my $p = HTML::PullParser->new ( doc => $doc, %options ); my $output = ""; while ( my $token = $p->get_token() ) { my $text = $token->[1]; $text =~ s/(\[\[asp_pp"[^"]+"asp_pp\]\])|(abc)/$1?$1:"<b>$2<\/b>"/gs +e if $token->[0] eq 'text' and ! $token->[2]; $output .= $text; } $output =~ s/\[\[asp_pp"([^"]+)"asp_pp\]\]/ "<%" . HTML::Entities::decode_entities ( $1 ) . "%>"/gse; print $output;
      Output:
      <input value="abc" /> <b>abc</b> &nbsp; <b>abc</b> <% abc ( '<input value="abc" /> abc &nbsp; abc <span> %>', $abc ); %> <input value="<%= $abc %>" abc />