AMIGA-RESISTANCE

Die Projektseite für alles rund um den Amiga
Aktuelle Zeit: 28 Mär 2024, 09:16

Alle Zeiten sind UTC


 

 

 



Ein neues Thema erstellen  Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1 2 »
Autor Nachricht
BeitragVerfasst: 06 Feb 2017, 19:29 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
Hallo HW Gemeinde,
normalerweise benutze ich zum parsen von HTMl Dateien RegEx. Hollywood kennt so etwas leider nicht, bzw. es gibt die String- Pattern.
Allerdings in der Doku nur sehr knapp erläutert und das auch nur in Englisch.

Funktioniert:
String$ = "<a>HalloWelt</a>"
DebugPrint(PatternFindStrShort(String$, "<a>(%w+)</a>"))
Das Debug- Fenster gibt HalloWelt aus. :D

Funktioniert nicht:
String$ = "<a>Hallo Welt</a>"
DebugPrint(PatternFindStrShort(String$, "<a>(%w+)</a>"))
Das Debug- Fenster gibt -1 aus :oops:

Wäre sehr dankbar wenn mir jemand StringPattern erklären könnte.

Grüße!


Nach oben
   
BeitragVerfasst: 07 Feb 2017, 09:59 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Leider habe ich das Konzept sämtlicher Pattern-Befehle auch
nicht begriffen, vor allem die, welche man mit der generischen
For-Schlaufe verwenden kann.

Ich habe erst heute Nacht wieder Zeit, einen Blick in das Handbuch
zu werfen. Entweder ist jemand schneller und kann Dir diese ganze
Geschichte mit den Pattern-Befehlen erklären oder ich gebe Dir
Morgen bescheid, falls ich es in der Zwischenzeit begriffen habe.

Griessli
Tipsi


Nach oben
   
BeitragVerfasst: 07 Feb 2017, 16:06 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
Hallo Tipsi
Zitat:
Leider habe ich das Konzept sämtlicher Pattern-Befehle auch
nicht begriffen, vor allem die, welche man mit der generischen
For-Schlaufe verwenden kann.

Puh, dachte schon ich sei zu blöd das zu kapieren. :D

Danke für Deine Hilfe. :daumen:

Grüße, Michael


Nach oben
   
BeitragVerfasst: 07 Feb 2017, 23:46 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Was möchtest Du eigentlich mit diesem Befehl erreichen?
Codezeilen auseinander nehmen? Falls Ja, hast Du
ein zwei drei Beispiele?

Ich frage, weil es vielleicht auch eine andere Möglichkeit
gibt, dies mit Hollywood zu erledigen.

Griessli
Tipsi


Nach oben
   
BeitragVerfasst: 08 Feb 2017, 12:56 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Wie geschrieben, diese Befehle ... auch für mich Bahnhof. Aber
schaue mal beim Befehl PatternReplaceStr() vorbei, da werden
die Platzhalter beschrieben, welche man einsetzen kann.

Bei Deinem obigen Beispiel wird -1 ausgegeben, weil das
Leerzeichen zwischen "Hallo" und "Welt" kein "alphanumerisches Zeichen"
ist.

Ich bin mir jetzt nicht ganz sicher, aber wenn ich die Dokumentation
richtig verstanden habe, müsste Dein Beispiel oben so lauten:
String$ = "<a>Hallo Welt</a>"
DebugPrint(PatternFindStrShort(String$, "<a>(%w+)%s*(%w+)</a>"))
Kann mich aber auch irren, eben ... Bahnhof, oder man kann das
auch mit anderen Platzhalter genauer bestimmen.


Aber wie oben schon gefragt: Was genau möchtest Du erreichen.
- Geht es darum, nur den Fliesstext heraus zu filtern?
- Brauchst Du auch die Textattribute wie fett/kursiv und so?
- Textgrösse?
- Steuerbefehle? Falls Ja: Welche genau? Alle? Nur zwei drei?
- ...?

Griessli
Tipsi


Nach oben
   
BeitragVerfasst: 08 Feb 2017, 17:21 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
Hi Tipsi
Zitat:
Was möchtest Du eigentlich mit diesem Befehl erreichen?
Codezeilen auseinander nehmen? Falls Ja, hast Du
ein zwei drei Beispiele?
Beispiel HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="content-type">
  <title></title>
</head>
<body>
HTML Beispiel<br>
<br>
<br>
Beispiel 1:<br>
<br>
Content: Meine Satzl&auml;nge ist immer unterschiedlich. Es
k&ouml;nnen alle m&ouml;glichen Zeichen vorhanden sein.<br>
<br>
Beispiel 2:<br>
<br>
Content: ab........................................<br>
<br>
</body>
</html>
Ich benötige den Content zwischen Beispiel 1 und Beispiel 2.
Zitat:
Ich frage, weil es vielleicht auch eine andere Möglichkeit
gibt, dies mit Hollywood zu erledigen.
Ich denke Du meinst das XMLParser Plugin.
Zitat:
String$ = "<a>Hallo Welt</a>"
DebugPrint(PatternFindStrShort(String$, "<a>(%w+)%s*(%w+)</a>"))
Das Pattern funktioniert, leider nur mit genau zwei Wörtern. :oops:
In meinen HTML´s ist die Content Länge immer unterschiedlich.
Zitat:
Wie geschrieben, diese Befehle ... auch für mich Bahnhof. Aber
schaue mal beim Befehl PatternReplaceStr() vorbei, da werden
die Platzhalter beschrieben, welche man einsetzen kann.
Klar, die Platzhalter habe ich längst gefunden, leider eben wirklich alles sehr knapp Dokumentiert. :oops:

Grüße


Nach oben
   
BeitragVerfasst: 09 Feb 2017, 00:14 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Ich versuche gerade, ein paar Zeilen Code zu schreiben.
Hab noch etwas Geduld, bin noch nicht fertig.

Griessli
Tipsi


Nach oben
   
BeitragVerfasst: 09 Feb 2017, 15:38 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Ich habe mal versucht, ein kleines Progrämmchen zu schreiben.
Wenn Du es startest, dann klicke mit der Maus auf die weisse
Fläche und Du kannst eine HTML-Datei aussuchen.

Es durchsucht dann die Datei Zeile für Zeile nach "Contents:" und
sollte dann diese Zeilen bis zum nächsten <br> oder <BR> ausgeben,
auch wenn "Contents:" und <br> auf verschiedenen Zeilen sind.

Ist das Fenster zu klein für die Ausgabe, dann ziehe es auseinander
und er Inhalt wird angepasst.

Leider ist mein Variablenstil nicht der beste. Sie sind Global und nicht
Lokal, was bei grossen Programmen nicht freundlich zum Speicher ist
und die Ausführung verlangsamen kann. Hier habe ich noch Nachholbedarf.
Ich habs versucht, aber viele Ablauffehler produziert. Darum sind die
Variablen in diesem Beispiel Global.

Ich hoffe, es ist in etwa das, was Du gesucht hast. Falls Du noch
Verfeinerungen brauchst wie vielleicht die Contents-Zeile auseinander
nehmen oder so, dann schreie (oder besser schreibe).

Griessli
Tipsi

/****************************************************************
**                                                             **
** Name:        Content                                        **
** Author:      Tipsi                                          **
** Version:     1.0                                            **
** Datum:       08.02.2017                                     **
** Function:    Mal schauen, ob das mit den HTML-Content geht! **
**                                                             **
****************************************************************/

@DISPLAY {Width = 640, Height = 480, Color = #WHITE, Sizeable = True}

Function p_Knopf(msg)
  Switch msg.action
  Case "OnMouseUp":
    p_HTML()
  EndSwitch
EndFunction

Function p_HTML()
  p_DateiLaden()
  i=0
  p_Ausgabe()
  Locate(1,1)
EndFunction

Function p_Ausgabe()
  Cls
  NPrint("Eingelesene Zeilen: "..ZeilenZaehler)
  NPrint("Gefundene Contents: "..ContentZaehler)
  NPrint(" ")
  NPrint("Text in Contents:")
  For i = 0 To ContentZaehler-1 Do NPrint(ContentText[i])
EndFunction

Function p_DateiLaden()
  Local Datei$ = FileRequest("Wähle eine HTML-Datei aus", "htm|html", #REQ_NORMAL)

  If Exists(Datei$)=True
    ZeilenZaehler = 1              ;Zählt die eingelesenen Zeilen
    TextZeile$ = ""                ;Hier wird die gerade eingelesene Zeile abgelegt
    GefundenContent = -1           ;Wenn FindStr() nichts findet, gibt sie -1 zurück
    GefundenLeerzeichen = -1
    GefundenLeerzeichen2 = -1
    GefundenBR = -1
    ContentZaehler = 0             ;Zählt die gefundenen Contents
    SchleifenZaehler = 0           ;Zur Sicherheit, damit die Schleife nicht unendlich ist
    ContentText = {}               ;Hier kommen die Zeilen rein, welche zu den Contents: gehören

    OpenFile(1,Datei$,#MODE_READ)

    While Not Eof(1)               ;Die Schleife wird solange durchlaufen, bis das Dateiende erreicht ist
      TextZeile$ = ReadLine(1)
      GefundenContent = FindStr(TextZeile$, "Content:", False)

      If GefundenContent <> -1
        GefundenBR = FindStr(TextZeile$, "<br>", False)
        ContentText[ContentZaehler] = TextZeile$

        If GefundenBR = -1         ;Falls der Contents-Text über mehrere Zeilen verteilt ist, wird weiter eingelesen
          Repeat
            TextZeile$ = ReadLine(1)
            ContentText[ContentZaehler] = ContentText[ContentZaehler]..TextZeile$
            GefundenBR = FindStr(TextZeile$, "<br>", False)

            SchleifenZaehler = SchleifenZaehler + 1
            If SchleifenZaehler = 10000 Then Break      ;Sicherheit, dass die Schleife nicht unendlich ist.
          Until GefundenBR <> -1
        EndIf

        ContentZaehler = ContentZaehler + 1

      Else
        If ContentZaehler = 0
          ContentText[ContentZaehler]="Nichts gefunden"
        EndIf
      EndIf

      ZeilenZaehler=ZeilenZaehler+1
    Wend

    CloseFile(1)
  Else
    Test=SystemRequest("Dateifehler","Fehler beim Dateinamen oder Abbruch","OK|OK")
    ZeilenZaehler = 0
    ContentZaehler = 0
    ContentText = {}
    ContentText[0] = "Fehler beim Dateinamen oder Abbruch"
  EndIf

EndFunction

SetFont(#SANS, 15)
SetFontStyle(#ANTIALIAS)
SetFontColor(#BLACK)

MakeButton(1, #SIMPLEBUTTON, 1, 1, 638, 478, {OnMouseUp = p_Knopf})

InstallEventHandler({SizeWindow = p_Ausgabe})

Repeat
	WaitEvent
Forever


Nach oben
   
BeitragVerfasst: 09 Feb 2017, 19:45 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
Hallo Tipsi

Zunächst, danke für den Code und Deine Mühe. :daumen: :daumen:
Hab heute leider etwas Zeitmangel, weshalb ich morgen erst detaillierter drauf eingehe.
Auf die schnelle getestet, scheint gut zu funktionieren. :D

Grüße, Michael


Nach oben
   
BeitragVerfasst: 10 Feb 2017, 17:12 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
Hallo Tipsi,
heute habe ich wirklich ausreichend Zeit um auf Deinen Lösungsweg einzugehen.
Zitat:
Leider ist mein Variablenstil nicht der beste. Sie sind Global und nicht
Lokal, was bei grossen Programmen nicht freundlich zum Speicher ist
und die Ausführung verlangsamen kann. Hier habe ich noch Nachholbedarf.
Ich habs versucht, aber viele Ablauffehler produziert. Darum sind die
Variablen in diesem Beispiel Global.
Das braucht Dir nicht peinlich zu sein. Das Global <> Lokal Handling in Hollywood ist wirklich mehr als nur gewöhnungsbedürftig, es widerspricht jeglicher Logik. Ist schon sehr ungewöhnlich (heutzutage) das Variablen generell Global sind.

So nun aber zu Deinem Code mit den "Standard" String Befehlen. Er ist ok, er funktioniert auch.
Aber bitte bedenke, ich habe nur ein ganz einfaches HTML Beispiel gepostet. Die Realität ist schwieriger. Im Content selber können ja auch noch weitere HTML- Tags sein.

Zum Beispiel:
Bold
Underline
Zeilenumbruch
.... und vieles mehr....

Solche Codes wie der von Dir werden immer fetter und immer unleserlicher.
Ich habe da wirklich Erfahrung mit, habe selber jahrelang Texte auf diese Art und Weise geparst weil ich zu faul war RegEx zu lernen.

Deswegen habe ich hier konkret nach den StringPattern- Befehlen gefragt. Scheint wohl so etwas wie RegEx light zu sein

Hier mal ein kleines Beispiel in einer anderen Basic- Sprache welche RegEx kann:
If CreateRegularExpression(0,"(?s)Content:(.*?)<br>")
  ExtractRegularExpression(0,string,Ergebnis.s())
  Debug Ergebnis.s(0)
EndIf 
Mal ganz ehrlich, sieht doch wirklich einfacher, eleganter und leserlicher aus?
Das Pattern ist PCRE RegEx welches heutzutage quasi Standard in vielen Programmiersprachen ist.

Schade das Andreas hier selten oder kaum reinschaut.

Grüße Michael


Nach oben
   
BeitragVerfasst: 10 Feb 2017, 23:24 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Jep, Dein Beispiel ist kürzer. In Hollywood müsste das unter anderem
mit dieser Zeile lösbar sein:

For k, v in PatternFindStr(HTMLDatei$, "Filtermuster") Do ContentText[k] = v

Aber eben, uns fehlt noch das Filtermuster. Schreib doch Andreas direkt
an, wie das Muster für

Content: bla bla bla bla <br>

aussieht. Würde mich auch wunder nehmen, da diese Pattern-Befehle sehr
viel Arbeit abnehmen können (wie Dein Beispiel zeigt).

Griessli
Tipsi


Nach oben
   
BeitragVerfasst: 11 Feb 2017, 08:16 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
Hi Tipsi,
Zitat:
aussieht. Würde mich auch wunder nehmen, da diese Pattern-Befehle sehr
viel Arbeit abnehmen können (wie Dein Beispiel zeigt).
Genau das denke ich auch. :daumen:

Habe Andreas mal ne Mail mit Link zu diesem Thread geschickt.

Melde mich wenn´s was neues gibt.

Grüße, Michael


Nach oben
   
BeitragVerfasst: 11 Feb 2017, 16:55 
Offline
Administrator
Benutzeravatar

Registriert: 30 Aug 2005, 19:42
Beiträge: 5303
Postleitzahl: 46047
Land: Deutschland
Wohnort: 46047 Oberhausen
Super wie Ihr zwei da mit dem Code umgeht.
Wünschte mir ich könnt da mitreden, aber leider fehlt mir dazu das Verständinis.
Auf jedenfall schön zu lesen das da fleißig programmiert wird. :daumen3:

_________________
Gruß Helmut
Amiga 2000, Amiga 500, Amiga One XE, Amiga One X5000


Nach oben
   
BeitragVerfasst: 11 Feb 2017, 17:14 
Offline
Alter Hase
Benutzeravatar

Registriert: 31 Mai 2016, 16:12
Beiträge: 63
Postleitzahl: 53489
Land: Deutschland
Wohnort: Sinzig / Rhein
@Helmut: Danke :D

@Tipsi:
Mein Sohn hat mir zwischenzeitlich die Anleitung zu den SringPattern ins deutsche übersetzt.

Das Muster welches wir benötigen:
.*

Ich poste später einen Beispielcode.


Grüße!


Nach oben
   
BeitragVerfasst: 11 Feb 2017, 18:55 
Offline
Schreiberling
Benutzeravatar

Registriert: 17 Okt 2007, 21:48
Beiträge: 1392
Postleitzahl: 4132
Land: Schweiz
Wohnort: Muttenz
Salli msu

Jep .* müssen vorkommen. Aber wie das mit Content: und <br>
zusammengefügt wird, wüsste ich nicht. Einige Tests bei mir
ergaben rein gar nichts. Ich hoffe, Du hast mehr Erfolg.

Griessli
Tipsi


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1 2 »

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Gehe zu: 

cron