Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7467[/thread]

RegExp - HTML Detection

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2005-11-14 02:14
#60094 #60094
Wie kann ich mit einer Perl 5 Regular Expression feststellen ob eine Datei HTML enthält wobei sowohl
Code: (dl )
1
2
<!-- beliebiger Kommentar am Kopf -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

als auch
Code: (dl )
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
gematcht werden soll.

Irgendwie komm ich damit bisher auf keinen grünen Zweig.
Code: (dl )
^(?i)(\s*<!--.*-->)*\s*<!DOCTYPE\s*HTML


Wer kann mir weiterhelfen? Danke.
betterworld
 2005-11-14 03:27
#60095 #60095
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Vielleicht kann File::Type das ja.

Hmm, ist das ueberhaupt erlaubt, vor dem DOCTYPE-Kram schon Kommentare zu schreiben?

Wenn Du einen Regexp suchst, hilft Dir vielleicht perldoc -q html ein bisschen weiter.\n\n

<!--EDIT|betterworld|1131931819-->
theli
 2005-11-14 06:47
#60096 #60096
User since
2005-11-14
2 Artikel
BenutzerIn
[default_avatar]
Leider hab ich nur "Perl 5 Regular Expressions" aber nicht Perl selbst zur Verfügung um den Content zu Testen.

Ob Kommentare über DOCTYPE erlaubt sind weiß ich leider nicht, jedenfalls gibt es aber auf der mysql Webseite leider einige Seiten die sowas haben.

Was ich nicht verstehe, ist warum der Teil
Code: (dl )
(\s*<!--.*-->)*
nicht das macht was er soll, nämlich optional Kommentare zu matchen. Ich glaub irgendwas versteh ich da noch nicht richtig.
pKai
 2005-11-14 09:55
#60097 #60097
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Ein Problem könnte sein, dass der Punkt (.) nur unter dem Modifikator (?s) einen Zeilenumbruch matcht.\n\n

<!--EDIT|pKai|1131955078-->
I sense a soul in search of answers.
renee
 2005-11-14 09:58
#60098 #60098
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wieso hast Du nur die RegExes zur Verfuegung und kein Perl??
Benutzt Du den Modifier //s im RegEx (damit . auch Newlines matcht)?

Nur mit den RegularExpressions wirst Du nicht feststellen koennen, ob es sich wirklich um HTML handelt oder ob nur zufaellig das DOCTYPE drinsteht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-11-14 11:22
#60099 #60099
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
(\s*<!--.*-->)*


ist keine gute Idee, insbesondere mit //s nicht... Bei

Code: (dl )
1
2
3
4
5
6
7
<!-- Start -->
...
...
langes Dokument
...
...
<!-- Ende -->


würde dann nämlich das komplette Dokument gefangen.

Besser sowas wie

Code: (dl )
\s*(<!--(?:(?!-->).)+-->)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sesth
 2005-11-14 11:39
#60100 #60100
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Wenn ich die ursprüngliche Frage richtig verstanden habe, geht es darum festzustellen, ob eine Datei HTML enthält. Das ist sehr allgemein formuliert und mir ist auch nicht klar in welchem Kontext das verwendet werden soll. Ein Definition ist, dass HTML-Dateien <html> + </html> enthalten sollten. Etwas formaler wird es, wenn Du Dich auf den DOCTYPE gemäß W3C zurückziehst. Eine dritte Definition könnte sein, "wenn es ein Browser anzeigen kann". Da ein Browser aber auch Text-Dateien anzeigt, hilft das nicht wirklich. Was ist also nach Deiner Definiton eine HTML-Datei?
Gruß
Thomas
Crian
 2005-11-14 11:42
#60101 #60101
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
[quote=sesth,14.11.2005, 10:39]Was ist also nach Deiner Definiton eine HTML-Datei?[/quote]
Ich denke, das hat der OP mit seinem Fang-Versuch deutlich gemacht.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sesth
 2005-11-14 11:50
#60102 #60102
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hmm, dort wird der DOCTYPE gesucht - der muss aber nicht zwingend vorhanden sein. Vor dem Doctype ein Kommentar ist auch ziemlich ungewöhnlich (vielleicht von einem Conten Mangaement System?). Vor einem XHTML-Doctype würde ich allenfalls eine Processing Instruction (z.B. <?xml version="1.0" encoding="iso-8859-1"?>) erwarten.

Ich wollte mit meiner Frage eigentlich nur auf das eigentliche Problem kommen, bevor hier mit RegExp's an der falschen Stelle zu tief gebohrt wird.
Gruß
Thomas
theli
 2005-11-14 12:05
#60103 #60103
User since
2005-11-14
2 Artikel
BenutzerIn
[default_avatar]
Danke für eure Hilfe.
Code: (dl )
^(?is)\s*(<!--(?:(?!-->).)+-->)*\s*<\!DOCTYPE\s*HTML.*$/
hat zum Erfolg geführt.

Quote
Wieso hast Du nur die RegExes zur Verfuegung und kein Perl??

Ich verwende für das YaCy Projekt zur MimeType-Erkennung die jMimeMagic Library die ein Ruleset mit Regeln zur Erkennung von gängigen Dateiformaten enthält.
Leider sind diese Regeln nicht sehr ausgereift weshalb ich eigene schreiben wollte um die Erkennung zuverlässiger zu machen.
Perl kann ich nicht verwenden da diese Lib in Java Programmiert ist, aber immerhin Perl 5 Regular Expression unterstützt.

@sesth:
Als Definition für ein gültiges HTML-Dokument reicht mir erst mal der DOCTYPE. Ich möchte dir Regel dann aber nach und nach verfeinern um "problematische" html Seiten auch damit matchen zu können.
<< >> 10 Einträge, 1 Seite



View all threads created 2005-11-14 02:14.