AMIGA-RESISTANCE https://forum.amiga-resistance.info/ |
|
String pattern ......ich verzweifle :( https://forum.amiga-resistance.info/viewtopic.php?f=38&t=3514 |
Seite 1 von 2 |
Autor: | msu [ 06 Feb 2017, 19:29 ] |
Betreff des Beitrags: | String pattern ......ich verzweifle :( |
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: Code: Alles auswählen String$ = "<a>HalloWelt</a>" DebugPrint(PatternFindStrShort(String$, "<a>(%w+)</a>")) Funktioniert nicht: Code: Alles auswählen String$ = "<a>Hallo Welt</a>" DebugPrint(PatternFindStrShort(String$, "<a>(%w+)</a>")) Wäre sehr dankbar wenn mir jemand StringPattern erklären könnte. Grüße! |
Autor: | Tipsi [ 07 Feb 2017, 09:59 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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 |
Autor: | msu [ 07 Feb 2017, 16:06 ] | |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( | |
Hallo Tipsi
Puh, dachte schon ich sei zu blöd das zu kapieren. Danke für Deine Hilfe. Grüße, Michael |
Autor: | Tipsi [ 07 Feb 2017, 23:46 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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 |
Autor: | Tipsi [ 08 Feb 2017, 12:56 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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: Code: Alles auswählen String$ = "<a>Hallo Welt</a>" DebugPrint(PatternFindStrShort(String$, "<a>(%w+)%s*(%w+)</a>")) 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 |
Autor: | msu [ 08 Feb 2017, 17:21 ] | ||||
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( | ||||
Hi Tipsi Beispiel HTML: Code: Alles auswählen <!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änge ist immer unterschiedlich. Es können alle möglichen Zeichen vorhanden sein.<br> <br> Beispiel 2:<br> <br> Content: ab........................................<br> <br> </body> </html> Ich denke Du meinst das XMLParser Plugin. Das Pattern funktioniert, leider nur mit genau zwei Wörtern. In meinen HTML´s ist die Content Länge immer unterschiedlich. Klar, die Platzhalter habe ich längst gefunden, leider eben wirklich alles sehr knapp Dokumentiert. Grüße |
Autor: | Tipsi [ 09 Feb 2017, 00:14 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
Salli msu Ich versuche gerade, ein paar Zeilen Code zu schreiben. Hab noch etwas Geduld, bin noch nicht fertig. Griessli Tipsi |
Autor: | Tipsi [ 09 Feb 2017, 15:38 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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 Code: Alles auswählen /**************************************************************** ** ** ** 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 |
Autor: | msu [ 09 Feb 2017, 19:45 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
Hallo Tipsi Zunächst, danke für den Code und Deine Mühe. Hab heute leider etwas Zeitmangel, weshalb ich morgen erst detaillierter drauf eingehe. Auf die schnelle getestet, scheint gut zu funktionieren. Grüße, Michael |
Autor: | msu [ 10 Feb 2017, 17:12 ] | |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( | |
Hallo Tipsi, heute habe ich wirklich ausreichend Zeit um auf Deinen Lösungsweg einzugehen. 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: Code: Alles auswählen If CreateRegularExpression(0,"(?s)Content:(.*?)<br>") ExtractRegularExpression(0,string,Ergebnis.s()) Debug Ergebnis.s(0) EndIf Das Pattern ist PCRE RegEx welches heutzutage quasi Standard in vielen Programmiersprachen ist. Schade das Andreas hier selten oder kaum reinschaut. Grüße Michael |
Autor: | Tipsi [ 10 Feb 2017, 23:24 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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 |
Autor: | msu [ 11 Feb 2017, 08:16 ] | |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( | |
Hi Tipsi, Genau das denke ich auch. Habe Andreas mal ne Mail mit Link zu diesem Thread geschickt. Melde mich wenn´s was neues gibt. Grüße, Michael |
Autor: | HelmutH [ 11 Feb 2017, 16:55 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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. |
Autor: | msu [ 11 Feb 2017, 17:14 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
@Helmut: Danke @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! |
Autor: | Tipsi [ 11 Feb 2017, 18:55 ] |
Betreff des Beitrags: | Re: String pattern ......ich verzweifle :( |
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 |
Seite 1 von 2 | Alle Zeiten sind UTC |
Powered by phpBB® Forum Software © phpBB Limited Deutsche Übersetzung durch phpBB.de |