Regular Explessions und Flex
-
Ich versuche einen Parser zu bauen der den relevanten Text aus einer HTML Seite
Extrahiert. Nun will ich erstmal das er alles was in bestimmten Tags ist rausschmeisst z.B. head und script.
Mit dem <head> Tag funktioniert das auch, mit <script> nicht weil es ja mehrere script Tags geben kann und es wird dann alles vom ersten öffnenden tag bis zum letzten schliessenden tag gematcht.
Wie muss die Regular Expression aussehen damit das richtig kommt.Hier den code den ich bis jetzt habe
%{ /* put your include files here */ %} %option case-insensitive ANYTAG "<"[^>]*">" HEAD_START "<"head[^>]*">" HEAD_END "<"\/head[^>]*">" SCRIPT_START "<"script[^>]*">" SCRIPT_END "<"\/script[^>]*">" HEAD {HEAD_START}(.|\n)*{HEAD_END} SCRIPT {SCRIPT_START}(.|\n)*{SCRIPT_END} %% {HEAD}|{SCRIPT} // ignore everything that is in this tags %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); } %%
-
Schlagt mich nicht wenn ich falsch liege, aber wenn ich das richtig mitbekommen habe hast du mit flex alein keine Chance, sondern musst das ganze in Zusammenarbeit mit bison lösen
-
ich weiß jezt nicht ob flex das kann, aber dein problem ist, dass Flex greedy matcht, also er zieht soviel aus dem eingabestream wie möglich, also vom ersten <script> bis zum letzten </script>.
Schau mal nach, ob du mit Flex non-greedy matchen kannst. mit boost::regex geht das jedenfalls und perl kann das auch. aber flex is ja auch schon ganz schön alt
-
Bei flex gibts keine speziellen Greedy-Operatoren. Aber man kann das Problem mit Zuständen lösen. Und zwar würde ich bei <script> in irgendeinen Zustand wechseln und in diesem alles ignorieren. Wird in diesem Zustand aber </script> gelesen, wechselt man halt wieder zum Initialzustand. Die Syntax dazu verrät einem das Manual von flex
