regex101 findet 12 Treffer - HTTPMOD gibt nichts zurück

Begonnen von Marko1976, 26 März 2026, 23:31:08

Vorheriges Thema - Nächstes Thema

Marko1976

Zitat von: Guybrush am 28 März 2026, 12:41:33wenn man verstanden hat, dass man abstrahieren muss und das hinbekommt
Dumm nur wenn genau DAS das Problem ist.
Natürlich habe ich klein angefangen und mich dann immer weiter vorgearbeitet. Doch dieser ganze Platzhalter-Mist ist für meine Auffassung nirgendwo verständlich dokumentiert, so dass ich genau damit meine Probleme habe.
Das ich am praktischen Beispiel hundert Mal mehr lerne als an stumpfer Theorie ist nun mal so, daher sorry wenn ich es jetzt wieder mal aussprechen muss, aber wollt ihr helfen oder habt ihr nur besserwisser Kommentare?

Ich habe mir bisher ALLES selbst erarbeitet, hier und da mit ein paar Tips, hie rund da mit Beispielen aus dem Netz. Also genau wie es hier im forum immer und immer wieder gewünscht wird und jetzt ist das auch nicht gut?

Ich habe den Fehler mit dem Leerzeichen statt dem \s selbst gefunden, einfach durch ausprobieren und lesen. Doch ab und zu kommt man damit leider nicht mehr weiter, wie eben in diesem Fall. Ich muss die Elemente nach Runden aufsplitten, darum komme ich für die spätere Weiternutzung nicht drumherum. Ich finde die Seite auch nicht optimal gestaltet, doch leider ist sie die einzige die all das was ich brauche beinhaltet.

Das Problem ist doch letztendlich, dass keine eindeutigen Klassen vergeben sind was die selektierbarkeit deutlich erschwert. Dazu kommt noch, das quasi ein Div im nächsten Div steht und durch weitere Div immer weiter aufgespittet wird.

Das bedeutet für mich, das miéine Regex mit der eindeutigen Bezeichnung der Spielrunde beginnen muss. Das einzige was sich dafür eignet ist:
<img class="pologo" alt="Viertelfinale" src="/typo3temp/assets/_processed_/5/3/csm_Viertelfinale_Rot_Wort_1b67629b64.png" width="166" height="15" />um es generisch zu halten würde ich es folgend abwandeln:<img class="pologo" alt="Viertelfinale" src=".*" width=".*" height=".*" />Damit spielt weder die Größe noch die Quelle eine Rolle, lediglich das Alt-Tag dient als eindeutige Identifizierung.

Doch wenn ich das vor meine funktionierende Regex einbaue um statt 12 Ergebnisse nur noch die 8 des Viertelfinales zu bekommen, ist der Suchbereich lediglich auf die ersten beiden Paarungen begrenzt und es wird immer nur ein Teamname gematch, entweder der erste oder der zweite. An den dritten und vierten komme ich gar nicht erst ran.
Wenn mir dabei jemand helfen will nehme ich diese Hilfe gerne an, doch möchte ich keine fertigen Lösungen sondern eben Erläuterungen warum ich was davor/dahinter setzen muss in meiner Regex - nur so kann man nachhaltig lernen und es irgendwann alleine können.

Guybrush

Zitat von: Marko1976 am 28 März 2026, 14:41:20Damit spielt weder die Größe noch die Quelle eine Rolle, lediglich das Alt-Tag dient als eindeutige Identifizierung.

wozu dann der andere kram, wenn das schon dein eindeutiger identifier ist? abstrahieren.. und nein, das ist kein besserwisserkommentar sondern eine hilfe, damit du voran kommst im lernen

Marko1976

@Guybrush
Weil mir die Begriffe Anker und Bereich im Zusammenhang mit Regex vollkommen Neu wahren und ich mir diese mithilfe der KI angeeignet habe statt wie erhofft hier einen Hinweis darauf zu bekommen.

Und ganz ehrlich, gerade deine Kommentare hatten NULL Inhalt, Vorschläge oder Hinweise.

Dein einziger echter Hinweis war der auf die Umlaute, den ich zu dem Zeitpunkt schon selbst in Erfahrung gebracht hatte. Statt dessen kommt eine Aufforderung Auszüge aus dem Quellcode zu posten obwohl genau das im ersten Post bereits komplett passiert ist..
Da bekomme ich den Eindruck es wird nicht mal der komplette Threat gelesen.

Das nenne ich sehr wohl Besserwisser. Oder wie nennst du es wenn jemand damit pralt mehr zu wissen, sein Wissen aber nicht teilt, statt dessen aber nicht mal in der Lage ist sich die Informationen vom Anfang durchzulesen - wobei genau das hier immer und immer wieder von Hilfesuchenden verlangt wird.

So, jetzt darf jeder gerne schmollen wie es in der Regel immer ist wenn man ein offenes Wort schreibt!

Guybrush

Zitat von: Marko1976 am 30 März 2026, 09:42:37Statt dessen kommt eine Aufforderung Auszüge aus dem Quellcode zu posten obwohl genau das im ersten Post bereits komplett passiert ist..
Da bekomme ich den Eindruck es wird nicht mal der komplette Threat gelesen.

Das nenne ich sehr wohl Besserwisser. Oder wie nennst du es wenn jemand damit pralt mehr zu wissen, sein Wissen aber nicht teilt, statt dessen aber nicht mal in der Lage ist sich die Informationen vom Anfang durchzulesen
du weisst schon wie viele Zeilen Code du da gepostet hast und keiner dafür irgendwas bekommt, hier was zu kommentieren? Wenn dir meine Hinweise nicht reichten, bitte. Aber ich werde mir nicht die Arbeit machen alles selbst rauszusuchen. Wenn du Regex lernen möchtest ist das doch super, aber dann solltest du dir fürs erste leichtere Sachen suchen. Das was du vor hast, ist schon mangels eindeutiger Identifier recht anspruchsvoll.

Marko1976

Zitat von: Guybrush am 30 März 2026, 13:29:42du weisst schon wie viele Zeilen Code du da gepostet hast und keiner dafür irgendwas bekommt, hier was zu kommentieren?
Für das Lernen bekomme ich auch nix, mache ich auch freiwillig. Und die Suchfunktion funktioniert auch in der Codebox recht gut - so jedenfalls würden Kommentar umgekehrt in meine Richtung aussehen wenn ich mich mit Aussagen dieser Art hier melden würde. Und NEIN, auch dem Hilfeleistenden muss man etwas zumuten, es kann nicht sein, dass immer nur alles an den Hilfesuchenden ausgelassen wird und man sich als Hilfeleistender von allem frei spricht. BEIDE - sowohl Hilfesuchender als auch Hilfeleistender - agieren auf gleicher Augenhöhe, das ist der Zweck solche Foren. Doch das wird gerade in diesem Forum sehr häufig vergessen.
Zitat von: Guybrush am 30 März 2026, 13:29:42Wenn du Regex lernen möchtest ist das doch super, aber dann solltest du dir fürs erste leichtere Sachen suchen. Das was du vor hast, ist schon mangels eindeutiger Identifier recht anspruchsvoll.
Das die Seite nicht optimal ist weiß ich selbst und hatte es ja auch bereits geschrieben. Doch es ist eben die einzige die das liefert was ich brauche. Schießlich gibt es nicht umsonst den Spruch "Man lernt an seinen Herausforderungen". Und mal im Ernst, das Hauptproblem bei Regex ist doch das ich es so selten brauche. Vielleicht einmal alle zwei, drei Jahre wenn ich gerade eine Aufgabe umsetzen will. Darum ist es auch so schwer die Platzhalter im Kopf abzuspeichern, abgesehen davon, dass es da natürlich auch unheimlich viele (eventuell sogar zu viele wegen Doppelung) gibt. Das heißt auch, dass ich nicht Zeit mit einfachen Beispielen verschwende sondern mich gezielt der Aufgabe zuwende die ich lösen will. Ich fliege ja auch nicht erst nach Londern, wenn ich von Düsseldorf nach Rom will  ;D .

Das ganze ist ja auch keine Wertung einzelner Leistungen, ich gebe einfach nur mal zurück wie es bei mir regelmäßig ankommt. Du must mehr lesen, selber aktiv sein, selbst recherchieren - all das sind Kommentare die hier regelmäßig von vielen Usern an Hilfesuchende kommen, doch wehe man dreht den Spieß mal um und gibt das 1:1 zurück oder erwartet das gleiche von den Hilfeleistenden.
Ja natürlich agiert jeder hier freiwillig und ohne Kostenerstattung, doch wenn ich dieses Forum mit anderen vergleiche sind hier schon zahlreiche Spezialisten (nicht positiv gemeint) unterwegs und das Board bzw. die Fhem-Gemeinde hat nicht umsonst einen schlechten Ruf im Netz bekommen. Wie gesagt, all das ist keine Wertung, sondern einfach nur eine Reflecktion.

Was die eigenltiche Aufgabe angeht habe ich diese bis auf einen Punkt komplett umgesetzt. Das einzige was mir noch fehlt sind die Einzelergebnisse bzw. Termine der noch offenen Spiele. Dazu habe ich auch schon eine Idee und muss nur noch etwas rumprobieren. Es wird vermutlich darauf hinaus laufen, dass ich einen Bereich in einem Bereich deklarieren muss, da ansonsten keine auswertbare Regel entsteht da manche Partien nur 3 Spiele haben, andere aber 4,5 oder 6 Partien. Die Zuordnung zur Anzeige wäre also praktisch nicht möglich, da man es ja nicht voraussagen kann. Dazu wäre eine eindeutige Frage wie man das am besten angeht: Zuerst den äßeren Bereich deklarieren, dann den Inneren und dann den Suchbegriff oder besser von Innen nach Außen arbeiten?

Allerdings muss ich sagen, dass diese Erfolge mehr der KI als diesem Forum zu verdanken sind. Und darüber würde ich mir mal Gedanken machen. Denn wenn ein unpersönlicher Bot mehr Hilfe leistet als eine Person, die sich dafür extra in einer entsprechenden Plattform anmeldet und mit dem Hilfesuchenden interagiert (was der Bot ja nicht kann), dann muss man die Leistung der Helfenden hier ganz neutral betrachtet doch in Frage stellen - oder wie siehst du das?

Marko1976

Also ich versuche es nochmal mit einer Frage zu dem Thema. Ich habe folgende wiederkehrende HTML-Blöcke auf der Seite:
                                                                    <div class="col text-center gameentry">
                                                                        <span class="teamshorts">SWW:KEC</span><br>
                                                                        <a href="/statistik/spieldetails/29032026_schwenninger-wild-wings_gg_koelner-haie_4347">
                                                                            2:4
                                                                        </a>
                                                                        <br>
                                                                       
                                                                    </div>
                                                                    <div class="col text-center gameentry">
                                                                        <span class="teamshorts">KEC:SWW</span><br>
                                                                        31.03.<br>
                                                                        19:30</div>
Der Unterschied besteht darin, dass die Ergebnisse in ein zusätzlich a-Tag eingeschlossen ist während die Termine ein zusätzlichen <br> und Uhrzeit haben.

Ich habe mir folgende Regex zusammengestellt die eigentlich in beiden Blöcken entweder das Ergebnis oder den Termin finden sollte:
<\/span><br>\s*<a href=".*">?\s*(.*)\s*?<\/a>?\s*?<br>\s*\S*?<\/div>

<\/span><br>\s*        -    eindeutig in beiden Blöcken vorhanden
<a href=".*">?         -    nur bei Ergebnissen vorhanden, darum durch ? optional
\s*                    -    Whitespace-Zeichen immer vor dem Suchbereich vorhanden
(.*)                   -    zu suchender Bereich
\s*?<\/a>?\s*?         -    Whitespace-Zeichen und schließendes a-Tag mit erneuten Whitespace-Zeichen nur bei Ergebnissen daher alle mit ? optional
<br>\s*                -    Zeilenumbruch mit anschließendem Whitespace-Zeichen in beiden Blöcken vorhanden
\S*?                   -    Non-Whitespace-Zeichen optional um die Uhrzeit zu umgehen
<\/div>                -    Ende des Suchbereichs
Da sich durch .* unendlich viele Zeichen im Suchbereich wiederholen können, sollte er sowohl Ergebnis als auch Termin finden.

Leider matchet regex101.com nur auf die Blöcke mit Ergebnissen, also mit den a-Tags und ignoriert die anderen Blöcke komplette.
Wenn ich die Infos im Netz richtig verstehe sorgt ein "?" dafür, dass ein Regex-Begriff vorhanden sein kann aber nicht muss, also Optional ist.
Frage: Warum ignoriert er dann die Terminblöcke komplett?
Frage: Warum funktioniert das ? als Kennzeichnung für Optionales nicht?

Lasse ich alles optionale raus, so wie hier
<\/span><br>\s*(.*)\s*<br>\s*\S*?<\/div>findet er nur die Termin-Blöcke - wie er in dem Fall ja auch soll.

Zur Vereinfachung hier noch mal beide Blöcke am Stück mit 2-3 Zeieln davor und dahinter:
                                                       
                                                           
                                                                    <div class="col text-center gameentry">
                                                                        <span class="teamshorts">SWW:KEC</span><br>
                                                                        <a href="/statistik/spieldetails/29032026_schwenninger-wild-wings_gg_koelner-haie_4347">
                                                                            2:4
                                                                        </a>
                                                                        <br>
                                                                       
                                                                    </div>
                                                               
                                                       
                                                           
                                                                    <div class="col text-center gameentry">
                                                                        <span class="teamshorts">KEC:SWW</span><br>
                                                                        31.03.<br>
                                                                        19:30</div>
                                                               
                                                       

RalfRog

An sich sollte man bei den vorangegangenen Einlassungen nichts mehr schreiben.
Auch für mich sind RegEx nicht der Freund - aber Seiten wie regex101.com sind m.E. ziemlich hilfeich.

Rein aus Interesse an der doch komplexen Suchaufgabe kommt bei mir das heraus:

FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Marko1976

Also du hast einige runde Klammern mehr gesetzt dessen Bedeutung nirgendwo im Netzt wirklich beschrieben steht. Ich bin immer davon ausgegangen, dass runde Klammern den zu suchenden Bereich umklammern, offenbar gibt es da ja noch mehr Bedeutungen.

Dennoch funktioniert es nicht. Wenn ich deine Regex 1:1 in Regex101.com übernehme kommt nur ein Catastrophic backtracking Error heraus wie du auf meinem Sreenshot hoffentlich sehen kannst.
Natürlich hat sich der Quelltext inzwischen etwas geändernt, da durch neue Spiele wieder Termine in Ergebnisse gewandelt wurden, aber das ändert ja nichts an der Struktur des Codes.

Ich nutze ja Regex101.com schon die ganze Zeit und komme bei diesem Problem einfach auf keinen grünen Zweig. Habe schon viele Variationen ausprobiert und immer wieder nachgelesen und auch per KI helfen lassen. Das einzige was ich eben hinbekommen habe war entweder Oder, doch nie beides.
Frage: Wieviel Code hast du im Test String eingegeben? Den ganzen Seitenquelltext oder nur einen Ausschnitt?
Catastrophic backtracking Error bedeutet für mich ja so etwas wie das er das Ziel vor dem Anfang gefunden hat wenn man es mal groß vereinfacht, oder nicht?

Zuletzt eine wirklich enrstgemeinte Frage. Warum sollte man bei den vorangegangenen Einlassungen nicht mehr antworten? Weil ich nicht in jedem Post dreimal Bitte und Danke schreibe oder weil ich erwarte auf Augenhöhe behandelt zu werden und nicht wie ein Bittsteller. Ganz ehrlich, darauf würde ich gerne mal eine echte und ehrliche Antwort haben, vielleicht passe ich mein Verhalten ja dann daran an wenn es eine gute Begründung gibt. Einfach nicht mehr antworten statt sich mit einem Problem auseinander zu setzen ist in meinen Augen eher kindisch. Für eine ehrliche argumentative Diskussion bin ich jederzeit zu haben, doch ich werde niemals irgendwessen Sklave, Bittsteller oder Unterwürfiger sein. Auch ist niemand Besser oder Schlechter als ich nur weil er auf einem bestimmten Gebiet vielleicht mehr weiß als ich.

passibe

Zitat von: Marko1976 am 02 April 2026, 13:00:57Bedeutung nirgendwo im Netzt wirklich beschrieben steht
Du siehst doch bei regex101 die Erklärung, was die jeweiligen Elemente sind? Und bei einer normalen Klammer, also z.B. (abc) steht "Capturing Group". Unten in der Quick Reference sind ja auch "Group Constructs" enthalten (die Quick Reference hat sogar ein Suchfeld, wo man "Capturing Group" eingeben könnte ...).

Nun, und dann kannst du vielleicht einfach mal nach "Capturing Group Regex" googeln, bei mir kommt dann z.B.: https://medium.com/@MynaviTechTusVietnam/regex-for-dummies-part-4-capturing-groups-and-backreferences-50c338a3b6f6

Und ich verstehe nicht, wenn du so viel AI nutzt, wie kamst du dann noch nicht auf die Idee, da einfach mal zu fragen "Was sind die runden Klammern? Bitte erkläre oder gib mir den Link zu einer Seite, die das erklärt."?

Marko1976

Zitat von: passibe am 02 April 2026, 14:16:53Du siehst doch bei regex101 die Erklärung, was die jeweiligen Elemente sind? Und bei einer normalen Klammer, also z.B. (abc) steht "Capturing Group". Unten in der Quick Reference sind ja auch "Group Constructs" enthalten (die Quick Reference hat sogar ein Suchfeld, wo man "Capturing Group" eingeben könnte ...).
Nur weil ich das Ding benutze heißt das nicht automatisch, dass ich alles daran verstehe. Ehrlich gesagt habe ich bis auf die beiden Felder in der Mitte noch keins wirklich durchschaut. Auch finde ich das mit den Farbuntermahlungen und Umrahmungen eher kontraproduktiv als sinnvoll. Mich jedenfalls verwirrt es mehr als das es nutzt. Die Quick Referenz habe ich tatsächlich noch gar nicht gesehen, was aber vielleicht auch daran liegt, dass meine Monitore auf 150% Größe stehen damit ich etwas lesen kann. Abgesehen davon tue ich mich mit DEM verwendeten Englisch sehr schwer.
Zitat von: passibe am 02 April 2026, 14:16:53Und ich verstehe nicht, wenn du so viel AI nutzt, wie kamst du dann noch nicht auf die Idee, da einfach mal zu fragen "Was sind die runden Klammern? Bitte erkläre oder gib mir den Link zu einer Seite, die das erklärt."?
Gegenfrage: Fragst du nach etwas das du zu kennen denkst?
Wie gesagt war ich im Glauben, dass die runde Klammer lediglich den Suchbegriff einschließt. Und da alle Versuche eine runde oder eckige  Klammer irgendwie in die Regex einzubauen immer zu Fehlern führte hat mich das in der Annahme nur bestärkt. Deshalb habe ich da tatsächlich nie die KI nach gefragt.

Bleibt also nur die Frage warum das Ergebnis bei mir und bei @RalfRog bei gleicher Regex so unterschiedlich ist. Kann ja eigentlich nur am Quellcode liegen, oder?

passibe

Ich hatte ja schon hierauf hingewiesen, ich meine, es könnte damit zusammenhängen:
Zitat von: passibe am 27 März 2026, 15:32:33Kurzer Hinweis noch, dass es dann zwischen regex101 und dem, was HTTPMOD macht, Unterschiede geben kann, wenn der "Inhalt" nicht 1:1 übereinstimmt. Also wenn das, was du in das untere "Test String"-Feld bei regex101 einfügst, nicht 1:1 dasselbe ist wie das, was HTTPMOD einliest, wenn es eine Website abruft, bringen dir die Matches in regex101 eher wenig.

Will damit nicht sagen, dass das hier das Problem ist, aber es kann z.B. sein, dass HTTPMOD die Zeilenumbrüche anders interpretiert als das, was du aus dem Browser-"Seitenquelltext anzeigen"-Ding rauskopierst und es deshalb nicht 1:1 passt. Ich glaube, man kann über verbose erreichen, dass HTTPMOD den gesamten Seitenquelltext ins FHEM-Log schreibt; wenn man das als "Test String" in regex101 reinpackt, müsste es aber eigentlich gehen.

Wenn HTTPMOD "A" bekommt, man regex101 aber (aus einer anderen Quelle) "B" füttert, dann kommt man natürlich nicht zum gewünschten Ergebnis (garbage in, garbage out). Deshalb ist darauf zu achten, dass man regex101 auch das füttert, was HTTPMOD nach dem Abrufen der Website tatsächlich verarbeitet.

Marko1976

Ja, dass hatte ich ja auch vermuten und ihn danach gefragt, doch leider bislang ohne Antwort.
Wenn ich das letzte Div-Tag ebenfalls in Klammern und mit ? schreibe oder komlett lösche, dann funktioniert es soweit mit dem gesamten Quellcode. Jedenfalls findet regex101.com dann 38 matches, was der Zahl der Ergebnisse + zukünftigen Termine entspricht.

Übernehme ich diese Regex dann aber ins HTTPMOD-Device erstellt mir der Eintrag statt 38 Matches 127 Readings, die zum Großteil leer sind, oder aber den öffnenden bzw. schließenden a-Tag oder aber das schließende div beinhalten, also alles nur nicht das gewünschte, nämlich die Ergebnisse und Termine. Und diesmal muss der Code im Test String von regex101 und im HTTPMOD-Device übereinstimmen. Habe extra nochmal in Regex101 den Quellcode aktuell eingelesen. Interessanterweise ist alles das was HTTPMOD findet - also in ein Reading schreibt - genau das was in der Regex in einer Klammer steht. Was meiner Interpretation der runden Klammer ja wieder zutreffend macht - alles was darin steht wird in HTTPMOD in ein Reading geschrieben. Gibt es in der Regex mehr als 1 rundes Klammerpaar werden entsprechend mehr Readings angelegt.

passibe

#27
Sorry, ich war jetzt faul und habe das einfach mal mit ChatGPT gebaut.
Keine Ahnung, ob das weiterhilft oder überhaupt das ist, was du willst, aber es extrahiert jedenfalls die Teams (Heim/Gast) und Ergebnisse und stellt diese als Tabelle dar.

Ich will damit eigentlich nur zeigen, dass heutzutage und bei Projekten, wo es maßgeblich auf das Ergebnis ankommt und nicht darauf, dass alles wie aus dem Lehrbuch ist, das Verständnis der RegEx im Einzelnen ein bisschen egal ist. So kommt man mit recht geringem Aufwand zum Ziel. Diesen HTML-Wust von dieser Seite nachzuvollziehen und sich die RegEx irgendwie mühsam auszudenken, macht doch auch nicht so richtig Spaß (mir zumindest macht es keinen Spaß).

Im Prinzip waren die Ergebnisse von ChatGPT 1:1 verwendbar, außer, dass es / nicht escaped hat (habe das vorher in regex101 validiert, da ist das aufgefallen). Beim devStateIcon nur eine kleine Anpassung, weil man dort kein return braucht.

Hier das Ergebnis:

HTTPMOD-Device:
defmod delspiele HTTPMOD https://www.penny-del.org/spiele 300
attr delspiele devStateIcon {\
    my $counter = 1;;\
    my $html = "<table border='1' style='border-collapse: collapse;;'>";;\
\
    # header row\
    $html .= "<tr><th>Home</th><th>Guest</th><th>Score</th></tr>";;\
\
    while (1) {\
        my $home  = ReadingsVal($name, "homeTeam-$counter",  "na");;\
        my $guest = ReadingsVal($name, "guestTeam-$counter", "na");;\
        my $score = ReadingsVal($name, "score-$counter",     "na");;\
\
        last if ($home eq "na" || $guest eq "na" || $score eq "na");;\
\
        $html .= "<tr>";;\
        $html .= "<td>$home</td>";;\
        $html .= "<td>$guest</td>";;\
        $html .= "<td>$score</td>";;\
        $html .= "</tr>";;\
\
        $counter++;;\
    }\
\
    $html .= "</table>";;\
    "<div>$html</div>"\
}
attr delspiele reading01Name score
attr delspiele reading01RegOpt g
attr delspiele reading01Regex <div class="col-12">\s*<div class="row">[\s\S]*?<h3>\s*(\d+:\d+)\s*<\/h3>
attr delspiele reading02Name homeTeam
attr delspiele reading02RegOpt g
attr delspiele reading02Regex <div class="col-12">\s*<div class="row">\s*<div class="col-5[^"]*">[\s\S]*?<\/div>\s*([^<\n][^<]*)
attr delspiele reading03Name guestTeam
attr delspiele reading03RegOpt g
attr delspiele reading03Regex <div class="col-12">\s*<div class="row">[\s\S]*?<h3>[\s\S]*?<\/h3>\s*<\/div>\s*<div class="col-5[^"]*">[\s\S]*?<\/div>\s*([^<\n][^<]*)

Der ChatGPT-Chatverlauf:
1. Mein Prompt (Habe das html hier mal rausgelassen, Post wäre sonst zu lang. Habe aber einfach das html gefüttert, so wie es aus einem blanken HTTPMOD mit verbose 5 rauskam; minus den ganzen unnötigen Kram (also head und alles, was zur Navigation gehört, habe bei <div class="site-content"> angefangen).)
Given the following html, I need three regexes that:
1. Match all scores (only those in col-12, not those in col-12 mt-3)
2. Match the "home" teams
3. Match the "visitor" teams

<html-code wie oben ausgeführt>

Antwort:
You *can* do this with regex, but fair warning: this HTML is structured enough that a parser (BeautifulSoup, etc.) would be much more robust. That said, here are solid regexes tailored to your exact structure.

---

## 1) Scores (only in `col-12`, NOT `col-12 mt-3`)

These are inside:

```html
<div class="col-12">
    ...
    <h3>4:0</h3>
```

### Regex:

```regex
<div class="col-12">\s*<div class="row">[\s\S]*?<h3>\s*(\d+:\d+)\s*</h3>
```

### Why it works:

* Anchors specifically to `div class="col-12"` (no `mt-3`)
* Lazily scans until `<h3>`
* Captures only scores like `4:0`, `3:1`, etc.

---

## 2) Home teams

These are always the **first `col-5` block** inside that same `col-12`.

### Regex:

```regex
<div class="col-12">\s*<div class="row">\s*<div class="col-5[^"]*">[\s\S]*?</div>\s*([^<\n][^<]*)
```

### Captured group:

* Group 1 = **home team name**

### Example match:

```
Kölner Haie
Adler Mannheim
```

---

## 3) Visitor teams

These are the **second `col-5` block** after the score.

### Regex:

```regex
<div class="col-12">\s*<div class="row">[\s\S]*?<h3>[\s\S]*?</h3>\s*</div>\s*<div class="col-5[^"]*">[\s\S]*?</div>\s*([^<\n][^<]*)
```

### Captured group:

* Group 1 = **visitor team name**

---

## Cleaner alternative (recommended)

If your regex engine supports it, a more structured approach:

### Extract each matchup block first:

```regex
<div class="col-12">\s*<div class="row">([\s\S]*?)</div>\s*</div>
```

Then run inside each block:

* **Home team:**

  ```regex
  <div class="col-5[^"]*">[\s\S]*?</div>\s*([^<]+)
  ```

* **Score:**

  ```regex
  <h3>\s*(\d+:\d+)\s*</h3>
  ```

* **Visitor team:**

  ```regex
  <h3>[\s\S]*?</h3>\s*</div>\s*<div class="col-5[^"]*">[\s\S]*?</div>\s*([^<]+)
  ```

---

If you tell me your language (Python, JS, etc.), I can give you a **ready-to-run extraction snippet**, which is honestly the safer route here.

2. Prompt zur Visualisierung im devStateIcon:
Now write some perl code that iteratively does something like

my $game = ReadingsVal($name,"homeTeam-$counter","na")." vs ".ReadingsVal($name,"guestTeam-$counter","na").": ".ReadingsVal($name,"score-$counter","na")

and loops over $counter until one value encounters na

then return everything formatted as a simple html table (or just a list, i guess? but also make a version where the three components are separated into a table)

Antwort:
Here's a clean Perl approach that does exactly what you described: iterate over `$counter` until one of the readings returns `"na"`, then build output.

I'll give you **two versions**:

1. Simple list
2. Proper HTML table

---

# ✅ 1) Simple list version

```perl
my $counter = 1;
my @games;

while (1) {
    my $home  = ReadingsVal($name, "homeTeam-$counter",  "na");
    my $guest = ReadingsVal($name, "guestTeam-$counter", "na");
    my $score = ReadingsVal($name, "score-$counter",     "na");

    # stop if any value is "na"
    last if ($home eq "na" || $guest eq "na" || $score eq "na");

    push @games, "$home vs $guest: $score";

    $counter++;
}

# build HTML list
my $html = "<ul>";
$html .= "<li>$_</li>" for @games;
$html .= "</ul>";

return $html;
```

---

# ✅ 2) HTML table version (separate columns)

```perl
my $counter = 1;
my $html = "<table border='1' style='border-collapse: collapse;'>";

# header row
$html .= "<tr><th>Home</th><th>Guest</th><th>Score</th></tr>";

while (1) {
    my $home  = ReadingsVal($name, "homeTeam-$counter",  "na");
    my $guest = ReadingsVal($name, "guestTeam-$counter", "na");
    my $score = ReadingsVal($name, "score-$counter",     "na");

    last if ($home eq "na" || $guest eq "na" || $score eq "na");

    $html .= "<tr>";
    $html .= "<td>$home</td>";
    $html .= "<td>$guest</td>";
    $html .= "<td>$score</td>";
    $html .= "</tr>";

    $counter++;
}

$html .= "</table>";

return $html;
```

---

# 💡 Optional improvements (worth considering)

### 1. Safer HTML (escaping)

If team names could contain special chars:

```perl
use HTML::Entities;
$home  = encode_entities($home);
$guest = encode_entities($guest);
$score = encode_entities($score);
```

---

### 2. Skip incomplete entries instead of stopping

If your data might have gaps:

```perl
last if ($home eq "na" && $guest eq "na" && $score eq "na");
next if ($home eq "na" || $guest eq "na" || $score eq "na");
```

---

### 3. Limit loop (safety guard)

```perl
last if $counter > 100;
```

Übrigens finde ich den Hinweis von ChatGPT auf Beautiful Soup gar nicht so verkehrt, vielleicht wäre es einfacher, das in Python auszulagern ...

RalfRog

#28
Zitat von: Marko1976 am 02 April 2026, 13:00:57Frage: Wieviel Code hast du im Test String eingegeben? Den ganzen Seitenquelltext oder nur einen Ausschnitt?

Das kann man doch ganz gut in dem Screenshot sehen was ich als Text eingegeben habe und was dann als "gefunden" markiert ist.

<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
<a href="/statistik/spieldetails/29032026_schwenninger-wild-wings_gg_koelner-haie_4347">
2:4
</a>
<br>
</div>
text                                                               
text

                                                           
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
31.03.<br>
19:30</div>



Quasi als Fingerübung (ohne die ganzen Leerzeichen) um zu sehen, ob ich mit etwas Trial&Error die beiden Fundstellen in regex101.com hinbekomme. Ging!  ;D


Nachtrag:
Genau was @passibe in #27 vorgeschlagen hat "Im Prinzip waren die Ergebnisse von ChatGPT 1:1 verwendbar", meinte ich in Nummer #12 mit meinem Hinweis auf letzten Dezember:
https://forum.fhem.de/index.php?msg=1353234
FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Prof. Dr. Peter Henning

Die Warnung des LLM ist eindeutig
ZitatYou *can* do this with regex, but fair warning: this HTML is structured enough that a parser (BeautifulSoup, etc.) would be much more robust.
Bezogen auf HTTPMOD heißt das ganz klar: XPath statt Regulärer Ausdrücke verwenden.

pah