Font
[thread]5633[/thread]

RegEx: großes, umfangreiches Problem

Reader: 1


<< |< 1 2 >| >> 19 entries, 2 pages
pktm
 2003-08-17 18:54
#65078 #65078
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Hallo!
Vielleicht erinnert sich wer ausm alten Forum an dieses Problem :)
Also ich habe mir eine FAQ angelegt.
Diese besteht aus lauter htmls. An diesem System will ich auch vorerst nichts ändern, auch wenn jemand mir eine noch so gute Lösung anbietet - sorry.
Also diese htmls haben folgenden Aufbau:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
<h1>Titel der Seite, z.B. Arrays</h1>
<li>toc, alle Beiträge sind am anfang der Seite aufgelistet
<li><a href="#irgendwas">da können auch tags zwischen li und toceintrag stehen
<hr /> #exakt so, nicht anders. <hr> wird nicht gematcht, <hr id="irgendeineID" /> auch nicht.
<h2>toc, alle Beiträge sind am anfang der Seite aufgelistet</h2>
hier steht der Beitrag, die Überschrift entspricht exakt dem, was im toc steht, hier darf kein <h2> oder <hr /> verwendet werden
<hr /> #trennzeichen
<a name="irgendwas">& </a>
<h2>da können auch tags zwischen li und toceintrag stehen</h2>
beitrag
<hr />

So, jetzt würde ich gerne, nachdem der Artikel bearbeitet wurde mit Hilfe des untenstehenden COdes prüfen, ob der User a) ein <hr /> in seinem beitrag sehen hat und b) überhaupt eines drinne ist (wenn nich -> anfügen) und wenn, ob es am Ende steht, also da wo es sein soll.
Bei mir passiert bis jetzt folgendes:
1. es kommt keine Feghlerausgabe
2. es wird irgendwie immer ein <hr /> angefügt, auch wenn 2 oder mehr am Ende stehen
Fazit: die RegEx findet das <hr /> garnicht.
Ich komme hier nicht weiter.
Hilfe!
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
            $subs{hint} .= qq~<p>PID: $query->{pid}</p>~;
# ---- alt
#        # validate ob keine <h2> und keine <hr />
#            if( $query->{beitrag_neu} =~ m|<hr />{2+}|i
#             or $query->{beitrag} =~ m|<hr />{2+}|i ){
#                $subs{error} .= qq~<p class="error">Beitrag darf kein &lt;hr /&gt enthalten!</p>~;
#            }
#        #ein <hr /> am Ende => wenn nicht, anhängen!
#            chomp( $query->{beitrag} );
#            if( $query->{beitrag} =~ m|<hr/>$|i ){
#                $subs{hint} .= qq~<p class=hint>hr am Ende enthalten!</p>~;
#            }else{
#                $query->{beitrag_neu} .= qq~<hr />~;
#            }
       # validate ob keine <h2> und keine <hr/>
           if( $query->{beitrag_neu} =~ m|(?:<hr />){2,}|i){
               $subs{error} .= qq~<p class="error">Beitrag darf kein &lt;hr /&gt enthalten!</p>~;
           }
       #ein <hr /> am Ende => wenn nicht, anhängen!
           chomp( $query->{beitrag} );
           if( $query->{beitrag} =~ m|<hr />$|i ){
               $subs{hint} .= qq~<p class=hint>hr am Ende enthalten!</p>~;
           }else{
               $query->{beitrag_neu} .= qq~<hr />~;
           }




           # validate auf andere verbotne Tags
           if( $query->{beitrag} =~ /<h2>/ ){
               $subs{error} .= qq~<p class="error">Beitrag darf kein &lt;h2&gt enthalten!</p>~;
           }
# ---- Fehlerbehandlung
           if( exists $subs{error} ){
               print "Fehler!\n";
               print substitute( extractFile( $tmplDir . '/artikel_edit_edit.html' ) );
           }else{
               print "weiter<p />$query->{topic_neu}\n";
               print qq~<table border="2"><tr><td>$query->{beitrag_neu}</td></tr></table>~;
               
# ---- toc editieren
           my @file = extractFile( $query->{file} );
           my %toc = ();
           my @toc = ();
           foreach ( 0..$#file ) {
               if( $file[$_] =~ m/<h2>/ig ) {
                   last;
               }else{
                   if( $file[$_] =~ m/<li>/i ) {
                       push @toc, $file[$_];
                       $toc{$file[$_]} = $_;
                   }
               }
           }
           
           # -> toc_alt löschen
           # -> toc_neu einfügen (=> insert-after) => Aufgabe von "Sortieren"
           my $tocZeile = undef; #Zeile in der Datei, in der der TOC-Eintrag gespeichert ist
           foreach( keys %toc ) {
               if( $_ =~ m/$toc[$query->{tocNr}]/ ) {
                   $tocZeile = $toc{$_};
               }
           }

           # $file[$tocZeile] = $query->{newTopic};
#            if( $zeile =~ m/<li>(<[^>]+>)*(.*)(<[^>]+>?)*/ig ){
#                # $2 = $query->{topic}
#            }
           # file auslesen
           # -> beitrag alt löschen
           # -> beitrag_neu einfügen
           # Meldung ausgeben
           }
           #beitrag speichern
           #open(DAT, ">$query->{file}" ) || die "$! ($query->{file})";
           #print DAT @inhalt;
           #close(DAT);


Wäre für verbesserungsvorschläge (an meinem Code!) auch dankbar.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
jan10001
 2003-08-17 21:30
#65079 #65079
User since
2003-08-14
962 articles
BenutzerIn
[default_avatar]
Vielleicht hilft dir der Link weiter:
http://www.regenechsen.de/regex_de/regex_1_de.html

Ist ne deutsche Anleitung zur Verwendung Regex.
Ronnie
 2003-08-18 01:30
#65080 #65080
User since
2003-08-14
2022 articles
BenutzerIn
[default_avatar]
Folgendes bereitet dir Probleme:
m|<hr />$|i

ersetze es durch:
m#<hr />$#i

liegt an der Bedeutung von $| (Dateihandle-bezogene Variable - deren Nutzung ich auch nicht kenne?!).

gruss,
Ronnie\n\n

<!--EDIT|Ronnie|1061155901-->
SirLant
 2003-08-18 01:42
#65081 #65081
User since
2003-08-04
516 articles
BenutzerIn
[default_avatar]
$| ist doch der Puffer
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Dubu
 2003-08-18 01:49
#65082 #65082
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
$| gibt an, ob auf dem aktuellen Ausgabekanal nach jeder Ausgabe ein Flush erzwungen werden soll.

Perl ist aber schlau genug und erkennt, dass das '|' hier die Regex begrenzt.
m#...$# wuerde ansonsten auch nicht funktionieren, da es natuerlich auch die Variable $# gibt. ;-)
kabel
 2003-08-18 03:06
#65083 #65083
User since
2003-08-04
704 articles
BenutzerIn
[default_avatar]
ich hab hier ne kleine, schmutzige parser-grammatik. sieht fast aus wie line-noise :blues: hehe

rück noch ein paar andere beispiele rüber, dann kann die sicher noch unvollständige grammaitk so weit angepasst werden, dass das ganze in ein ordentliches format gebracht werden kann.

pktm, ganz tief in deinem inneren willst du auch das format ändern. ich weiss es. 8)
-- stefan
pktm
 2003-08-18 03:18
#65084 #65084
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Ach Kabel, du weist doch, wenn ich das Format jetzt in ein Wiki ändere lerne ich nicht mit solch kniffeligen Aufgaben umzugehen ^_^
http://www.intergastro-service.de (mein erstes CMS :) )
Dubu
 2003-08-18 03:30
#65085 #65085
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Du sollst es ja auch nicht in ein Wiki aendern sondern in XML. :p
Ronnie
 2003-08-18 10:18
#65086 #65086
User since
2003-08-14
2022 articles
BenutzerIn
[default_avatar]
Sorry, es sprang mir so ins Auge weil mein Editor es highlightet ($|) - und es klang plausibel.
kabel
 2003-08-18 11:43
#65087 #65087
User since
2003-08-04
704 articles
BenutzerIn
[default_avatar]
pktm, poste doch bitte noch mal ein paar beispiele für solche faq-einträge. wie ich schon sagte, wenn die grammatik das parsen kann, wird automatisch eine datenstruktur erzeugt, die leicht in ein beliebiges format gewandelt werden kann. du wirst dann auch einfach syntaktische prüfungen durchführen können. :)
-- stefan
<< |< 1 2 >| >> 19 entries, 2 pages



View all threads created 2003-08-17 18:54.