Nach wie vor liege ich mit Regex auf Kriegsfuss.
Habe jetzt regex101.com genutzt und dort gibt mir die Regex
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt=".*" src=".*" width=".*" height=".*" \/>
<\/div>
(.*)
<\/div>Bei folgendem Seitencode
<div class=" "></div>
<h1 class="">Spielplan</h1>
<div id="c10" class="frame frame-default frame-type-list frame-layout-0">
<div class="row">
<div class="col-lg-12">
<style>
.teamshorts {
font-size:12px;
}
</style>
<div class="row playoff-fullsize">
<div class="col-lg-12">
<div class="card">
<div class="card__header">
<img class="pologo" alt="Playoff" src="/typo3temp/assets/_processed_/4/6/csm_PLAYOFF_LOGO_rot_eeabda88d8.png" width="105" height="15" />
</div>
<div class="card__content">
<div class="row my-3">
<div class="col">
<h3 class=" ml-4"></h3>
</div>
</div>
<div class="row">
</div>
<div class="row my-3">
<div class="col">
<img class="pologo" alt="Viertelfinale" src="/typo3temp/assets/_processed_/5/3/csm_Viertelfinale_Rot_Wort_1b67629b64.png" width="166" height="15" />
</div>
</div>
<div class="row">
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Kölner Haie" src="/fileadmin/images/teams/2023/team_11.svg" width="200" height="176" />
</div>
Kölner Haie
</div>
<div class="col-2 text-center">
Serie<br>
<h3>1:0</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Schwenninger Wild Wings" src="/fileadmin/images/teams/2023/team_15.svg" width="200" height="114" />
</div>
Schwenninger Wild Wings
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
<a href="/statistik/spieldetails/25032026_schwenninger-wild-wings_gg_koelner-haie_4341">
0:1
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
27.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
29.03.<br>
15:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
31.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
02.04.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
04.04.<br>
15:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
06.04.<br>
00:00</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Adler Mannheim" src="/fileadmin/images/teams/2023/team_2.svg" width="200" height="200" />
</div>
Adler Mannheim
</div>
<div class="col-2 text-center">
Serie<br>
<h3>1:0</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Pinguins Bremerhaven" src="/fileadmin/images/teams/2023/team_9.svg" width="184" height="200" />
</div>
Pinguins Bremerhaven
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
<a href="/statistik/spieldetails/25032026_adler-mannheim_gg_pinguins-bremerhaven_4340">
5:2
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">BHV:MAN</span><br>
27.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
29.03.<br>
16:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">BHV:MAN</span><br>
31.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
02.04.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">BHV:MAN</span><br>
04.04.<br>
19:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
06.04.<br>
00:00</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Straubing Tigers" src="/fileadmin/images/teams/2023/team_6.svg" width="174" height="200" />
</div>
Straubing Tigers
</div>
<div class="col-2 text-center">
Serie<br>
<h3>1:0</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Eisbären Berlin" src="/fileadmin/images/teams/2023/team_3.svg" width="160" height="160" />
</div>
Eisbären Berlin
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">STR:EBB</span><br>
<a href="/statistik/spieldetails/24032026_straubing-tigers_gg_eisbaeren-berlin_4339">
5:1
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">EBB:STR</span><br>
27.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">STR:EBB</span><br>
29.03.<br>
14:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">EBB:STR</span><br>
31.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">STR:EBB</span><br>
02.04.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">EBB:STR</span><br>
04.04.<br>
16:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">STR:EBB</span><br>
06.04.<br>
00:00</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="EHC Red Bull München" src="/fileadmin/images/teams/2023/team_12.svg" width="200" height="160" />
</div>
EHC Red Bull München
</div>
<div class="col-2 text-center">
Serie<br>
<h3>0:1</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="ERC Ingolstadt" src="/fileadmin/_processed_/5/c/csm_team_1_7a9cf9eecf.png" width="181" height="200" />
</div>
ERC Ingolstadt
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">RBM:ING</span><br>
<a href="/statistik/spieldetails/24032026_ehc-red-bull-muenchen_gg_erc-ingolstadt_4338">
5:6
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">ING:RBM</span><br>
27.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">RBM:ING</span><br>
29.03.<br>
19:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">ING:RBM</span><br>
31.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">RBM:ING</span><br>
02.04.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">ING:RBM</span><br>
04.04.<br>
14:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">RBM:ING</span><br>
06.04.<br>
00:00</div>
</div>
</div>
</div>
</div>
<div class="row my-3">
<div class="col">
<h3 class=" ml-4">1. Playoff-Runde</h3>
</div>
</div>
<div class="row">
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Pinguins Bremerhaven" src="/fileadmin/images/teams/2023/team_9.svg" width="184" height="200" />
</div>
Pinguins Bremerhaven
</div>
<div class="col-2 text-center">
Serie<br>
<h3>2:0</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Nürnberg Ice Tigers" src="/fileadmin/images/teams/2023/team_14.svg" width="177" height="200" />
</div>
Nürnberg Ice Tigers
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">BHV:NIT</span><br>
<a href="/statistik/spieldetails/17032026_pinguins-bremerhaven_gg_nuernberg-ice-tigers_4334">
4:0
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">NIT:BHV</span><br>
<a href="/statistik/spieldetails/20032026_nuernberg-ice-tigers_gg_pinguins-bremerhaven_4336">
2:3
</a>
<br>
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Grizzlys Wolfsburg" src="/fileadmin/images/teams/2023/team_8.svg" width="190" height="200" />
</div>
Grizzlys Wolfsburg
</div>
<div class="col-2 text-center">
Serie<br>
<h3>1:2</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Schwenninger Wild Wings" src="/fileadmin/images/teams/2023/team_15.svg" width="200" height="114" />
</div>
Schwenninger Wild Wings
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">WOB:SWW</span><br>
<a href="/statistik/spieldetails/18032026_grizzlys-wolfsburg_gg_schwenninger-wild-wings_4335">
3:1
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">SWW:WOB</span><br>
<a href="/statistik/spieldetails/20032026_schwenninger-wild-wings_gg_grizzlys-wolfsburg_4337">
5:1
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">WOB:SWW</span><br>
<a href="/statistik/spieldetails/22032026_grizzlys-wolfsburg_gg_schwenninger-wild-wings_4354">
2:3
</a>
<br>
OT
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer ================================================== -->
<footer id="footer" class="footer">
<!-- Footer Widgets -->
<div class="footer-widgets">
<div class="footer-widgets__inner">
<div class="container">
<div class="row">
<div class="col-12">
<!-- Main Navigation -->
<h3 class="widget__title">Intern</h3>
<div class="row">
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/ligabuero"
target=""
title="Ligabüro"
>Ligabüro</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="https://www.championshockeyleague.com/"
target="_blank"
title="Champions Hockey League"
>Champions Hockey League</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="https://www.hockeyeurope.eu/"
target="_blank"
title="Hockey Europe"
>Hockey Europe</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="https://profisport-deutschland.de/"
target="_blank"
title="Initiative Profisport Deutschland"
>Initiative Profisport Deutschland</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="https://www.eurohockeyclubs.com/"
target="_blank"
title="Alliance of European Hockey Clubs"
>Alliance of European Hockey Clubs</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="https://vsa-ev.de/"
target="_blank"
title="Vereinigung Sportsponsoring-Anbieter"
>Vereinigung Sportsponsoring-Anbieter</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/spielervermittler"
target=""
title="Spielervermittler"
>Spielervermittler</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/partner"
target=""
title="Partner"
>Partner</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/kontakt-presse"
target=""
title="Kontakt/Presse"
>Kontakt/Presse</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/impressum"
target=""
title="Impressum"
>Impressum</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/datenschutz"
target=""
title="Datenschutz"
>Datenschutz</a>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-2">
<a href="/intern/datenschutz-fantasy"
target=""
title="Datenschutz - Fantasy"
>Datenschutz - Fantasy</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer Widgets / End -->
<!-- Footer Secondary -->
<div class="footer-secondary">
<div class="container">
<div class="footer-secondary__inner">
<div class="row">
<div class="col-lg-12">
<!-- Social Links -->
<ul class="social-links social-links--btn social-links--btn-plus">
<li class="social-links__item">
<a href="https://www.instagram.com/penny.del/" target="_blank" class="social-links__link social-links__link--instagram">
<i class="fab fa-instagram"></i>
<span class="social-links__label">Instagram</span>
<span class="social-links__icon"><i class="fas fa-plus"></i></span>
</a>
</li>
<li class="social-links__item">
<a href="https://www.facebook.com/PENNY.DEL" target="_blank" class="social-links__link social-links__link--facebook">
<i class="fab fa-facebook"></i>
<span class="social-links__label">Facebook</span>
<span class="social-links__icon"><i class="fas fa-plus"></i></span>
</a>
</li>
<li class="social-links__item">
<a href="https://www.threads.com/@penny.del" target="_blank" class="social-links__link social-links__link--threads">
<img src="/_assets/e4ccd237e60ebadf8c55c336e47a814f/images/social/threads/logo.svg" width="21" height="21" alt="" />
<span class="social-links__label">Threads</span>
<span class="social-links__icon"><i class="fas fa-plus"></i></span>
</a>
</li>
<li class="social-links__item">
<a href="https://youtube.com/@PennyDEL" target="_blank" class="social-links__link social-links__link--youtube">
<i class="fab fa-youtube"></i>
<span class="social-links__label">Youtube</span>
<span class="social-links__icon"><i class="fas fa-plus"></i></span>
</a>
</li>
<li class="social-links__item">
<a href="https://tiktok.com/@penny.del" target="_blank" class="social-links__link social-links__link--tiktok">
<i class="fab fa-tiktok"></i>
<span class="social-links__label">TikTok</span>
<span class="social-links__icon"><i class="fas fa-plus"></i></span>
</a>
</li>
<li class="social-links__item">
<a href="https://www.linkedin.com/company/penny-del" target="_blank" class="social-links__link social-links__link--linkedin">
<i class="fab fa-linkedin"></i>
<span class="social-links__label">Linkedin</span>
<span class="social-links__icon"><i class="fas fa-plus"></i></span>
</a>
</li>
</ul>
<!-- Social Links / End -->
</div>
</div>
</div>
</div>
</div>
<!-- Footer Secondary / End -->
</footer>
<!-- Footer / End -->
</div>insgesamt 12 Treffer zurück.
Egal ob ich die Regex genauso wie oben oder in einer einzigen Zeile im Device eingebe wird dort leider gar nichts zurück gegeben und ich verstehe einfach nicht wieso.
Hier noch das List des HTTPMOD-Device:
Internals:
BUSY 0
DEF https://www.penny-del.org/spiele 3000
FUUID 66cf7fe7-f33f-7706-7aa6-c94072d116681b44
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 3000
MainURL https://www.penny-del.org/spiele
ModuleVersion 4.2.0 - 11.8.2023
NAME hockey_playoff
NOTIFYDEV global
NR 381
NTFY_ORDER 50-hockey_playoff
STATE name-1
TYPE HTTPMOD
eventCount 147
value
CompiledRegexes:
HttpUtils:
NAME
addr https://www.penny-del.org:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.penny-del.org/spiele
header
host www.penny-del.org
httpheader HTTP/1.1 200 OK
date: Thu, 26 Mar 2026 22:19:02 GMT
server: Apache/2.4.52 (Ubuntu)
content-language: de-DE
cache-control: max-age=0
expires: Thu, 26 Mar 2026 22:19:02 GMT
vary: Accept-Encoding
content-encoding: gzip
x-ua-compatible: IE=edge
x-content-type-options: nosniff
content-length: 8979
keep-alive: timeout=5, max=100
content-type: text/html; charset=utf-8
connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /spiele
protocol https
redirects 0
timeout 60
url https://www.penny-del.org/spiele
sslargs:
OLDREADINGS:
QUEUE:
READINGS:
2026-03-26 23:19:02 standing-1 1:0
2026-03-26 23:19:02 standing-2 1:0
2026-03-26 23:19:02 standing-3 1:0
2026-03-26 23:19:02 standing-4 0:1
2026-03-26 23:19:02 standing-5 2:0
2026-03-26 23:19:02 standing-6 1:2
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.penny-del.org/spiele
defptr:
readingBase:
logo-1 reading
logo-2 reading
logo-3 reading
logo-4 reading
name-1 reading
name-10 reading
name-11 reading
name-12 reading
name-2 reading
name-3 reading
name-4 reading
name-5 reading
name-6 reading
name-7 reading
name-8 reading
name-9 reading
standing-1 reading
standing-2 reading
standing-3 reading
standing-4 reading
standing-5 reading
standing-6 reading
standing-7 reading
standing-8 reading
standing-9 reading
readingNum:
logo-1 02
logo-2 02
logo-3 02
logo-4 02
name-1 01
name-10 01
name-11 01
name-12 01
name-2 01
name-3 01
name-4 01
name-5 01
name-6 01
name-7 01
name-8 01
name-9 01
standing-1 03
standing-2 03
standing-3 03
standing-4 03
standing-5 03
standing-6 03
standing-7 03
standing-8 03
standing-9 03
readingOutdated:
readingSubNum:
logo-1 -1
logo-2 -2
logo-3 -3
logo-4 -4
name-1 -1
name-10 -10
name-11 -11
name-12 -12
name-2 -2
name-3 -3
name-4 -4
name-5 -5
name-6 -6
name-7 -7
name-8 -8
name-9 -9
standing-1 -1
standing-2 -2
standing-3 -3
standing-4 -4
standing-5 -5
standing-6 -6
standing-7 -7
standing-8 -8
standing-9 -9
requestReadings:
update:
logo-1 reading 02-1
logo-2 reading 02-2
logo-3 reading 02-3
logo-4 reading 02-4
name-1 reading 01-1
name-10 reading 01-10
name-11 reading 01-11
name-12 reading 01-12
name-2 reading 01-2
name-3 reading 01-3
name-4 reading 01-4
name-5 reading 01-5
name-6 reading 01-6
name-7 reading 01-7
name-8 reading 01-8
name-9 reading 01-9
standing-1 reading 03-1
standing-2 reading 03-2
standing-3 reading 03-3
standing-4 reading 03-4
standing-5 reading 03-5
standing-6 reading 03-6
standing-7 reading 03-7
standing-8 reading 03-8
standing-9 reading 03-9
Attributes:
alias DEL Play-Off's
enableControlSet 1
group Eishockey
icon Wunderlist
reading01Name name
reading01RegOpt g
reading01Regex <div class="col-5 text-center"> <div class="imgcontainer"> <img class="img-fluid poteamlogo" alt=".*" src=".*" width=".*" height=".*" \/> <\/div> (.*) <\/div>
reading02Name logo
reading02RegOpt g
reading02Regex <div xclass="imgcontainer"><img class="img-fluid poteamlogo" alt=.* src="(.*)" width="200" height="176" /></div>
reading03Name standing
reading03RegOpt g
reading03Regex <h3>(.*)<\/h3>
reading04Name nameVF
reading04RegOpt g
reading04Regex <p class="hw-appdb__playoff__round__serie__info">(.*)<\/p>
room Information->Sport
stateFormat name-1
timeout 60
userattr .*
verbose 0Es geht erstmal nur um das Reading1, also das Reading "name". "logo" ist noch nicht bearbeitet und "standing" funktioniert. "nameVF" ist für einen Versuch vorgesehen, da ich noch andere Ideen habe die ich gerne umsetzen möchte.
Ich möchte diesen Mist endlich verstehen, daher wäre ich für jeden Tip dankbar.
du musst auch line breaks etc mit in deinen match aufnehmen. dein regex kann so nicht funktionieren. Wenn du nur die Namen haben willst, dann passt die regex hier:
^<\/div>$\s^(\w[\s\w]*)$\s^<\/div>$
grundsätzlich immer die kürzest mögliche regex wählen. das ist in deinem fall die obige. Das von dir gesuchte steht einzeln in einer Zeile bestehend aus mindestens einem oder mehreren Wörtern. in den zeilen davor/dahinter kommt jeweils nur ein </div> vor. es sind 8 treffer.
Dann nutzt regex101 ja prinzipiell doch wieder nichts, denn da werden die Treffer ja auch so gefunden.
Apropo Treffer, es sollten eigentlich 12 sein, aber da muss ich mir den Quelltext noch mal genau ansehen.
Die Frage ist allerdings was die Bedeutung von
(\w[\s\w]*)im einzelnen ist. /w und /s ist klar, aber speziell die eckige Klammer ist für mich unverständlich. Da aber einige Treffer aus mehr als zwei Wörtern bestehen ist hier wohl auch der Grund warum nur 8 statt 12 Treffer gematcht werden
regex101 ist ein super tool und hilft auch mir bei komplexeren regex. wie gesagt - deine regex war schon unnötig lang und es fehlten z.b. die linebreaks (\s). habs nicht bei regex101 nachgestellt, aber kann mir nicht vorstellen, dass das da so auch ging.
wegen deiner Frage nach der Bedeutung der Regex
\w = irgendein Wort (dafür könnte man auch [a-zA-z0-9_] nehmen, was das gleiche wäre)
[\s\w]* leerzeichen oder wörter, die weiter vorkommen können, aber nicht müssen
Kölner Haie würdest du mit \w finden. Damit du " Haie" findest, brauchst du [\s\w]. In dem konkreten Beispiel könntest du auch \w\s\w machen, was auch matchen würde. Aber da es auch mehr als 2 wörter geben kann und ggf. mehrere leerzeichen auch hintereinander kommen ist [\s\w] besser, da die Reihenfolge dann keine Rolle mehr spielt. Das * bedeutet nur, dass es vorkommen kann, aber nicht muss.
Kurzer 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.
Zusätzlich muss man noch beachten, dass regex101 standardmäßig /gm, also global + multiline Flags setzt, bin mir grade nicht sicher, was HTTPMOD da macht bzw. wie man das ändert. Das kann aber auch eine weitere Fehlerquelle sein (wie gesagt, muss nicht sein, dass das hier das Problem ist, aber sollte man ggfs. ausschließen).
Leider hast du nicht erklärt wozu die eckige Klammer explizit ist, genau die gibt mir nach wie vor die meisten Rätsel auf.
Zitat von: Guybrush am 27 März 2026, 13:43:44Aber da es auch mehr als 2 wörter geben kann und ggf. mehrere leerzeichen auch hintereinander kommen ist [\s\w] besser, da die Reihenfolge dann keine Rolle mehr spielt.
Dann ist es mir unerklärlich warum er nur 8 statt 12 Matches hat. Es sind zwar Wiederholungen, dennoch müssten sie ja als Match gefunden werden.
Das die Regex so viel Vorbau hat ist dem Gedankengang geschuldet, dass ich eigentlich zwischen den einzelnen Runden unterscheiden will, also 4 Matches in der 1. Runde, 8 Mannschaften im Viertelfinale, 4 Mannschaften im Halbfinale und 2 Mannschaften im Finale. Die beiden letzteren werden im Verlauf noch zur Webseite hinzugefügt werden - was genau mein Problem sein wird, da sie oberhalb hinzugefügt werden. Was also jetzt als 1. Mannschaft Viertelfinale gematch wird, würde ab dem Halbfinale dann die 1. Mannschaft Halbfinale wiedergeben. Was wiederrum meine Seitendarstellung und Auswertung über den Haufen schmeißt.
Deshalb hatte ich Hier (https://forum.fhem.de/index.php?topic=144283.0) schon gefragt, ob man mit HTTPMOD eine Webseite auch von unten nach oben auswerten lassen kann, do sowohl eine Netzrecherche als auch hier im Forum ergab keine Antwort.
Dein Code
^<\/div>$\s^(\w[\s\w]*)$\s^<\/div>$erzeugt übrigens bei mir im Device 0 Matches - jedenfals werden keine neuen Readings mit den Teamnamen erzeugt.
Hier noch mal ein aktuelles List des Device:
Internals:
BUSY 0
DEF https://www.penny-del.org/spiele 3000
FUUID 66cf7fe7-f33f-7706-7aa6-c94072d116681b44
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 3000
MainURL https://www.penny-del.org/spiele
ModuleVersion 4.2.0 - 11.8.2023
NAME hockey_playoff
NOTIFYDEV global
NR 381
NTFY_ORDER 50-hockey_playoff
STATE name-1
TYPE HTTPMOD
eventCount 210
value
CompiledRegexes:
HttpUtils:
NAME
addr https://www.penny-del.org:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.penny-del.org/spiele
header
host www.penny-del.org
httpheader HTTP/1.1 200 OK
date: Fri, 27 Mar 2026 14:49:56 GMT
server: Apache/2.4.52 (Ubuntu)
content-language: de-DE
cache-control: max-age=0
expires: Fri, 27 Mar 2026 14:49:56 GMT
vary: Accept-Encoding
content-encoding: gzip
x-ua-compatible: IE=edge
x-content-type-options: nosniff
content-length: 8767
keep-alive: timeout=5, max=100
content-type: text/html; charset=utf-8
connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /spiele
protocol https
redirects 0
timeout 60
url https://www.penny-del.org/spiele
sslargs:
OLDREADINGS:
QUEUE:
READINGS:
2026-03-27 15:49:57 series-1 1:0
2026-03-27 15:49:57 series-2 1:0
2026-03-27 15:49:57 series-3 1:0
2026-03-27 15:49:57 series-4 0:1
2026-03-27 15:49:57 series-5 2:0
2026-03-27 15:49:57 series-6 1:2
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.penny-del.org/spiele
defptr:
readingBase:
logo-1 reading
logo-2 reading
logo-3 reading
logo-4 reading
name-1 reading
name-10 reading
name-11 reading
name-12 reading
name-2 reading
name-3 reading
name-4 reading
name-5 reading
name-6 reading
name-7 reading
name-8 reading
name-9 reading
series-1 reading
series-2 reading
series-3 reading
series-4 reading
series-5 reading
series-6 reading
standing-1 reading
standing-2 reading
standing-3 reading
standing-4 reading
standing-5 reading
standing-6 reading
standing-7 reading
standing-8 reading
standing-9 reading
readingNum:
logo-1 02
logo-2 02
logo-3 02
logo-4 02
name-1 01
name-10 01
name-11 01
name-12 01
name-2 01
name-3 01
name-4 01
name-5 01
name-6 01
name-7 01
name-8 01
name-9 01
series-1 03
series-2 03
series-3 03
series-4 03
series-5 03
series-6 03
standing-1 03
standing-2 03
standing-3 03
standing-4 03
standing-5 03
standing-6 03
standing-7 03
standing-8 03
standing-9 03
readingOutdated:
readingSubNum:
logo-1 -1
logo-2 -2
logo-3 -3
logo-4 -4
name-1 -1
name-10 -10
name-11 -11
name-12 -12
name-2 -2
name-3 -3
name-4 -4
name-5 -5
name-6 -6
name-7 -7
name-8 -8
name-9 -9
series-1 -1
series-2 -2
series-3 -3
series-4 -4
series-5 -5
series-6 -6
standing-1 -1
standing-2 -2
standing-3 -3
standing-4 -4
standing-5 -5
standing-6 -6
standing-7 -7
standing-8 -8
standing-9 -9
requestReadings:
update:
logo-1 reading 02-1
logo-2 reading 02-2
logo-3 reading 02-3
logo-4 reading 02-4
name-1 reading 01-1
name-10 reading 01-10
name-11 reading 01-11
name-12 reading 01-12
name-2 reading 01-2
name-3 reading 01-3
name-4 reading 01-4
name-5 reading 01-5
name-6 reading 01-6
name-7 reading 01-7
name-8 reading 01-8
name-9 reading 01-9
series-1 reading 03-1
series-2 reading 03-2
series-3 reading 03-3
series-4 reading 03-4
series-5 reading 03-5
series-6 reading 03-6
standing-1 reading 03-1
standing-2 reading 03-2
standing-3 reading 03-3
standing-4 reading 03-4
standing-5 reading 03-5
standing-6 reading 03-6
standing-7 reading 03-7
standing-8 reading 03-8
standing-9 reading 03-9
Attributes:
alias DEL Play-Off's
enableControlSet 1
group Eishockey
icon Wunderlist
reading01Name name
reading01RegOpt g
reading01Regex ^<\/div>$\s^(\w[\s\w]*)$\s^<\/div>$
reading02Name logo
reading02RegOpt g
reading02Regex <div xclass="imgcontainer"><img class="img-fluid poteamlogo" alt=.* src="(.*)" width="200" height="176" /></div>
reading03Name series
reading03RegOpt g
reading03Regex <h3>(.*)<\/h3>
reading04Name nameVF
reading04RegOpt g
reading04Regex <p class="hw-appdb__playoff__round__serie__info">(.*)<\/p>
room Information->Sport
stateFormat name-1
timeout 60
userattr .*
verbose 0Was mich dabei etwas verwundert, es werden alle alten Readings (die ich längst geloscht habe) unter Readingsupdate, Readingsbase, Readingsnum etc. gelistet - natürlich nicht als Reading mit Inhalt. Dennoch scheinen die Readings ja irgendwie verarbeitet zu werden.
@passibe
Ich hatte in dem unteren Textfeld lediglich die Einrückungen rausgelöscht, aber ansonsten nichts. Das gm kannst du einfach ändern indem du darauf klickst und in der List den Haken beim Eintrag m deaktivierst. Das habe ich beachtet, da ich im Device nur g stehen habe.
Also
<div class="col-5 text-center">[\s\S]*?<\/div>\s(.*)\s<\/div>erzeugt 6 Readings (name-1 bis name-6) aber alle ohne Inhalt.
<\/div>\s(\w[\s\w]*)\s<\/div>erzeugt nicht mal die 6 Leere Readings.
wenn du konkretere hilfe möchtest, dann poste mal die zeilen, die du matchen willst mit jeweils den 2 davor und dahinter..
[\s\S] ist im übrigen total sinnfrei, weil das alles = "." ist. wenn du mit .* arbeitest, ist das ? für shortest match im regelfall essentiell...
Mit zwei Zeilen drübe rund drunter kommt man nicht weit. Leider ist die Webseite sehr unglücklich aufgebaut, alleine da keine eindeutigen Klassen vergeben sind.
Hier mal eine Auszug aus dem Quellcode:
<div class="row">
<div class="col-lg-12">
<style>
.teamshorts {
font-size:12px;
}
</style>
<div class="row playoff-fullsize">
<div class="col-lg-12">
<div class="card">
<div class="card__header">
<img class="pologo" alt="Playoff" src="/typo3temp/assets/_processed_/4/6/csm_PLAYOFF_LOGO_rot_eeabda88d8.png" width="105" height="15" />
</div>
<div class="card__content">
<div class="row my-3">
<div class="col">
<h3 class=" ml-4"></h3>
</div>
</div>
<div class="row">
</div>
<div class="row my-3">
<div class="col">
<img class="pologo" alt="Viertelfinale" src="/typo3temp/assets/_processed_/5/3/csm_Viertelfinale_Rot_Wort_1b67629b64.png" width="166" height="15" />
</div>
</div>
<div class="row">
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Kölner Haie" src="/fileadmin/images/teams/2023/team_11.svg" width="200" height="176" />
</div>
Kölner Haie
</div>
<div class="col-2 text-center">
Serie<br>
<h3>1:0</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Schwenninger Wild Wings" src="/fileadmin/images/teams/2023/team_15.svg" width="200" height="114" />
</div>
Schwenninger Wild Wings
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
<a href="/statistik/spieldetails/25032026_schwenninger-wild-wings_gg_koelner-haie_4341">
0:1
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
27.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
29.03.<br>
15:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
31.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
02.04.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
04.04.<br>
15:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
06.04.<br>
00:00</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 mx-auto my-3 singleseries">
<div class="col-12">
<div class="row">
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Adler Mannheim" src="/fileadmin/images/teams/2023/team_2.svg" width="200" height="200" />
</div>
Adler Mannheim
</div>
<div class="col-2 text-center">
Serie<br>
<h3>1:0</h3>
</div>
<div class="col-5 text-center">
<div class="imgcontainer">
<img class="img-fluid poteamlogo" alt="Pinguins Bremerhaven" src="/fileadmin/images/teams/2023/team_9.svg" width="184" height="200" />
</div>
Pinguins Bremerhaven
</div>
</div>
</div>
<div class="col-12 mt-3">
<div class="row">
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
<a href="/statistik/spieldetails/25032026_adler-mannheim_gg_pinguins-bremerhaven_4340">
5:2
</a>
<br>
</div>
<div class="col text-center gameentry">
<span class="teamshorts">BHV:MAN</span><br>
27.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
29.03.<br>
16:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">BHV:MAN</span><br>
31.03.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
02.04.<br>
19:30</div>
<div class="col text-center gameentry">
<span class="teamshorts">BHV:MAN</span><br>
04.04.<br>
19:00</div>
<div class="col text-center gameentry">
<span class="teamshorts">MAN:BHV</span><br>
06.04.<br>
00:00</div>
</div>
</div>
</div>
Mit geht es um die Mannschaftsnamen, also "Kölner Haie", "Schwenninger Wild Wings" oder "Adler Mannheim". Den kompletten Quelltext hatte ich aber bereits schon mal im 1. Post geschrieben.
Da ich vermutlich die Teamnamen nach den einzelnen Runden aufteilen muss, wird die Regex vermutlich mit
<img class="pologo" alt="Viertelfinale" src="/typo3temp/assets/_processed_/5/3/csm_Viertelfinale_Rot_Wort_1b67629b64.png" width="166" height="15" />beginnen müssen, da es wie schon öfters geschrieben sonst zu Problemen mit der Zuordnung kommen wird, sobald die nächste Runde zur Seite hinzugefügt wird.
Hab es jetzt noch mal mit <\/div>\s*(\w[\s\w]*)\s<\/div>probiert, damit werden zumindest 8 Readings erstellt. Allerdings ist im Reading hinter dem Mannschaftsnamen noch die ganzen Tabs mit ausgelesen worden und es fehlen "Kölner Haie", "Eisbären Berlin" "EHC Red Bull München" und "Nürnberg Ice Tigers". Schaue Morgen mal nach warum die nicht eingeschlossen werden. Warum er allerdings die Tabs mit einschließt ist für mich nicht erkennbar.
<\/div>\s*(\w+[ \w]+)\s*<\/div>liefert die Teamnamen ohne die folgenden Tabs so wie es sein sollte. Allerdings fehlen immer noch die oben genannten Teamnamen.
Stellt sich also die Frage wo ist der Unterschied zwischen:
</div>
Kölner Haie
</div>und
</div>
Schwenninger Wild Wings
</div>.
Optisch sehe ich keinen Unterschied, dennoch wird "Kölner Haie" nicht gefunden.
Kann es seien, dass \w keine Umlaute wie ö, ä, ü etc. findet? Falls ja, welche Alternative gäbe es dazu die Umlaute abzugreifen?
umlaute matcht \w nicht. da musst du dann in die eckige klammer noch äöüÄÖÜß aufnehmen zusätzlich zu \s\w, also [\sa-zA-Z0-9äöüÄÖÜß]
Also zum einen funktioniert das \s\w nicht, da genau da \s der Grund dafür ist, dass die Tabs hinter dem Teamnamen mit gematcht werden. Nur wenn ich statt dem \s ein echtes Leerzeichen benutze funktioniert es.
Das mit der Erweiterung der Umlaute hat geklappt, ist aber nicht die schönste Art.
Habe in der Doku was von Reading[1-9]Decode gelesen womit das Sprachpaket auf utf-8 umgestellt werden soll. Versuche damit haben weder auf globaler Ebene mit GetDecode als auch Readingspezifisch nicht funktioniert, wobei ich mir dabei nicht mal über die richtige Schreibweise von utf-8 im Klaren bin. Groß, klein, mit Leerzeichen oder ohne, Bindestrich ja oder nein - es gibt so viele unterschiedliche Schreibweisen im Netz, keine Ahnung welche hier die Richtige ist. Kann zum Thema UTF jemand was sagen? Das wäre meiner Meinung nach die elegantere Lösung.
Und dann muss ich mir halt noch Gedanken um die Auftrennung der einzelnen Spielrunden machen.
Hattest du mal @passibes Vorschlag vom Dezember weiterverfolgt?
Letztlich klemmt es in deinem HTTPMOD ja immer wieder.
https://forum.fhem.de/index.php?msg=1353235
Ja habe ich und teilweise genau aus diesem Grund verworfen - ich will es ja verstehen und keine fertigen Lösungen. Für mich ist das Ganze ein Lernprozess.
Abgesehen davon ist das Problem von damals bereits (durch eine selbst erlernte Lösung) gelöst. Jetzt geht es nicht um die Haupttabelle, sondern um die danach stattfindenen Playoffs. Also ein ganz anderer Bereich mit anderen Daten, da hilft die Fertiglösung von damals rein gar nichts mehr.
wenn du regex lernen möchtest, dann fang doch mit trivialeren sachen erstmal an und abstrahiere deine regex soweit wie es geht, also ohne textpassagen zu nutzen.. regex sind ansich einfach, wenn man verstanden hat, dass man abstrahieren muss und das hinbekommt
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.
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
@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!
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.
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?
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 SuchbereichsDa 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>
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:
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.
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."?
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?
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.
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.
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 ...
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
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
@passibe
Naja, ChatGPT hat die falschen Ergebnisse erwischt, aber grundsätzlich gute Arbeit mit der KI. Die Teamnamen und das Serien-Ergebniss habe ich bereits rausbekommen. Wo ich aktuell dran bin sind die Einzelergebnisse.
Die Einzelnen Serien setzen sich ja aus jeweils bis zu sieben Spielen zusammen.
Und was dort in der KI-Lösung noch fehlt - wonach du aber wahrscheinlich auch nciht gefragt hast - ist eine Aufsplittung nach Runde, also Finale, Halbfinale, Viertelfinale und 1. Play-Off-Runde.
Der Grund dafür ist wieder der Seitenaufbau, denn z.b. aktuell gibt es das Finale noch gar nicht auf der Seite und wird erst hinzugefügt wenn die entsprechenden Mannschaften feststehen. Das bedeutet aber leider, dass der Inhalt der jetzt im ersten Reading landet (zur Zeit Kölner Haie, weil 1. Halbfinalbegegnung) stände dann plötzlich im 3. gefundenen Reading, da im 1. und 2. die Gegner der Finalpartien stehen.
Zitat von: RalfRog am 02 April 2026, 22:27:10Das kann man doch ganz gut in dem Screenshot sehen was ich als Text eingegeben habe und was dann als "gefunden" markiert ist.
Nein kann man nicht, da man ja nicht weiß was darüber oder darunter außerhalb des Fensters noch steht. Doch es ist schon wie vermuten. Leider bewirkt auch das herauslöschen der Leerzeichen eine extreme Änderung der Regex - das hatte ich selbst schon mal ausprobiert und völlig andere Ergebnisse bzw. Regex bekommen als mit.
Zitat von: RalfRog am 02 April 2026, 22:27:10letzten Dezember:
Letzten Dezember ging es um etwas völlig anderes, bitte fang nicht wieder davon an um weitere Missverständnisse zu vermeiden. Das eine war die reguläre Tabelle der Hauptrunde, das aktuell sind die Playoffs. Andere Seite, anderer Aufbau und Struktur, andere Auswertungen notwendig.
Zitat von: Marko1976 am 03 April 2026, 20:58:31Die Teamnamen und das Serien-Ergebniss habe ich bereits rausbekommen. Wo ich aktuell dran bin sind die Einzelergebnisse
Mit ein bischen spielen gehts wohl - allerdings ist nicht ganz klar zu welchen Readings du genau willst.
Auch hier für mich einfach der Versuch sich mit deinem Ansatz und Hilfe von regex101.com schrittweise zu nähern.
=> Livecode aus https://www.penny-del.org/spiele
Attributesattr eis reading01Name name
attr eis reading01RegOpt g
attr eis reading01Regex <div class="col-5 text-center">\v +<div class="imgcontainer">\v +<img class="img-fluid poteamlogo" alt.*images.*" \/>\v.*\v +\b(.*)\v.*\v.*\v.*Serie
attr eis reading02Name standing
attr eis reading02RegOpt g
attr eis reading02Regex <h3>(.*)<\/h3>
attr eis reading03Name einzel
attr eis reading03RegOpt g
attr eis reading03Regex <div class="col text-center gameentry">\v.*teamshorts">(\w+:\w+).*\v.*\v +(\d:\d)\v
Readingseinzel-1 SWW:KEC 2026-04-04 22:08:51
einzel-2 0:1 2026-04-04 22:08:51
einzel-3 KEC:SWW 2026-04-04 22:08:51
einzel-4 4:2 2026-04-04 22:08:51
einzel-5 SWW:KEC 2026-04-04 22:08:51
einzel-6 2:4 2026-04-04 22:08:51
einzel-7 KEC:SWW 2026-04-04 22:08:51
einzel-8 2:1 2026-04-04 22:08:51
einzel-9 MAN:BHV 2026-04-04 22:08:51
einzel-10 5:2 2026-04-04 22:08:51
einzel-11 BHV:MAN 2026-04-04 22:08:51
einzel-12 4:5 2026-04-04 22:08:51
einzel-13 MAN:BHV 2026-04-04 22:08:51
einzel-14 5:1 2026-04-04 22:08:51
einzel-15 BHV:MAN 2026-04-04 22:08:51
einzel-16 6:1 2026-04-04 22:08:51
einzel-17 MAN:BHV 2026-04-04 22:08:51
einzel-18 4:3 2026-04-04 22:08:51
einzel-19 STR:EBB 2026-04-04 22:08:51
einzel-20 5:1 2026-04-04 22:08:51
einzel-21 EBB:STR 2026-04-04 22:08:51
einzel-22 2:1 2026-04-04 22:08:51
einzel-23 STR:EBB 2026-04-04 22:08:51
einzel-24 2:4 2026-04-04 22:08:51
einzel-25 EBB:S 2026-04-04 22:08:51
einzel-26 2:1 2026-04-04 22:08:51
einzel-27 STR:EBB 2026-04-04 22:08:51
einzel-28 2:1 2026-04-04 22:08:51
einzel-29 RBM:ING 2026-04-04 22:08:51
einzel-30 5:6 2026-04-04 22:08:51
einzel-31 ING:RBM 2026-04-04 22:08:51
einzel-32 1:6 2026-04-04 22:08:51
einzel-33 RBM:ING 2026-04-04 22:08:51
einzel-34 5:2 2026-04-04 22:08:51
einzel-35 ING:RBM 2026-04-04 22:08:51
einzel-36 7:2 2026-04-04 22:08:51
einzel-37 RBM:ING 2026-04-04 22:08:51
einzel-38 6:3 2026-04-04 22:08:51
einzel-39 BHV:NIT 2026-04-04 22:08:51
einzel-40 4:0 2026-04-04 22:08:51
einzel-41 NIT:BHV 2026-04-04 22:08:51
einzel-42 2:3 2026-04-04 22:08:51
einzel-43 WOB:SWW 2026-04-04 22:08:51
einzel-44 3:1 2026-04-04 22:08:51
einzel-45 SWW:WOB 2026-04-04 22:08:51
einzel-46 5:1 2026-04-04 22:08:51
einzel-47 WOB:SWW 2026-04-04 22:08:51
einzel-48 2:3 2026-04-04 22:08:51
name-1 Kölner Haie 2026-04-04 22:08:51
name-2 Adler Mannheim 2026-04-04 22:08:51
name-3 Kölner Haie 2026-04-04 22:08:51
name-4 Adler Mannheim 2026-04-04 22:08:51
name-5 Straubing Tigers 2026-04-04 22:08:51
name-6 EHC Red Bull München 2026-04-04 22:08:51
name-7 Pinguins Bremerhaven 2026-04-04 22:08:51
name-8 Grizzlys Wolfsburg 2026-04-04 22:08:51
standing-1 0:0 2026-04-04 22:08:51
standing-2 0:0 2026-04-04 22:08:51
standing-3 4:0 2026-04-04 22:08:51
standing-4 4:1 2026-04-04 22:08:51
standing-5 2:3 2026-04-04 22:08:51
standing-6 3:2 2026-04-04 22:08:51
standing-7 2:0 2026-04-04 22:08:51
standing-8 1:2 2026-04-04 22:08:51
Zitat von: Marko1976 am 03 April 2026, 20:58:31...wird erst hinzugefügt wenn die entsprechenden Mannschaften feststehen. Das bedeutet aber leider, dass der Inhalt der jetzt im ersten Reading landet (zur Zeit Kölner Haie, weil 1. Halbfinalbegegnung) stände dann plötzlich im 3. gefundenen Reading...
Die Frage ist dann doch schon ob das so Sinn macht, da die kleinste Änderung alles durcheinander bringt.
Hilfreich in dem Zusammenhang zum Erkennen der Struktur sind die Entwicklertools z.B. Firefox (F12) oder ganz gezielt per Rechtsklick "Untersuchen (Q)"
Zitat von: Marko1976 am 03 April 2026, 20:58:31Leider bewirkt auch das herauslöschen der Leerzeichen eine extreme Änderung der Regex - das hatte ich selbst schon mal ausprobiert und völlig andere Ergebnisse bzw. Regex bekommen als mit.
Zitat von: RalfRog am 04 April 2026, 00:25:45Die Frage ist dann doch schon ob das so Sinn macht, da die kleinste Änderung alles durcheinander bringt.
Nein, eben nicht.
Der "Threat"-Ersteller kann es drehen und wenden wie er will, er kann auch noch so oft um Hilfe rufen und andere beleidigen:
Das ist kein Anwendungsfall für Reguläre AusdrückeSondern der klassische Anwendungsfall für XPath.
LG
pah
Zitat4 April 2026, 03:45:50
@pah Lass Dir doch vom Thread-Ersteller keine schlaflosen Nächte machen... 8)
Zitat von: betateilchen am 04 April 2026, 09:06:35keine schlaflosen Nächte machen.
Normale Arbeitszeit. Keiner stört... ;D
Zitat von: Marko1976 am 26 März 2026, 23:31:08Nach wie vor liege ich mit Regex auf Kriegsfuss.
Zitat von: Marko1976 am 24 März 2026, 15:57:48Ist es in Deutschland mitlerweile Verpönt mal normale ganze Wörter zu benutzen? Das bringt mich genauso weit wie gar nichts zu sagen.
Eben. Darum sagt man auch "Regulärer Ausdruck", nicht "Regex".
LG
pah
Zitat von: Prof. Dr. Peter Henning am 04 April 2026, 09:51:10Zitat von: Marko1976 am 24 März 2026, 15:57:48Ist es in Deutschland mitlerweile Verpönt mal normale ganze Wörter zu benutzen?
Darum sagt man auch "Regulärer Ausdruck"
Wobei "regulär" ja auch kein deutsches Wort ist, sondern vom lateinischen "regularis = einer Regel gemäß" kommt.
Vielleicht könnte man "regelgerechter Ausdruck" sagen?
*duck-und-weg*
Zitat von: Marko1976 am 03 April 2026, 20:58:31@passibe
Naja, ChatGPT hat die falschen Ergebnisse erwischt, aber grundsätzlich gute Arbeit mit der KI. Die Teamnamen und das Serien-Ergebniss habe ich bereits rausbekommen. Wo ich aktuell dran bin sind die Einzelergebnisse.
Ah, ok. Ja, dann würde ich wohl in der Tat jetzt eher den Fokus auf XPath setzen, siehe:
https://forum.fhem.de/index.php?topic=45176
unter "aus der Doku zu XPath:"
@RalfRog
Genau um die Ergebinsse geht es mir aktuell. Und eben um die Termine der noch nicht ausgespielten Einzelpartien. Eine Serie kann ja ab dem Viertelfinale bis zu 7 Spiele umfassen bis der sieger feststeht. Ich hänge mal einen Screenshot an und versuche zu kennzeichen was wie wo relevant ist. Alles Grüne habe ich bereits abgehakt, alles Rote fehlt mir noch und Gelb markiere ich die jeweiligen Gruppierungen für die Roten Elemente. Blau kennzeichnet eine Runde der Play-Offs bei der immer Zwei Mannschaften in mehreren Spielen aufeinander treffen. Ähnlich einem KO-System werden es dann immer weniger Mannschaften.
Screenshot 2026-04-04 192506.jpg
Zitat von: RalfRog am 04 April 2026, 00:25:45Die Frage ist dann doch schon ob das so Sinn macht, da die kleinste Änderung alles durcheinander bringt.
Leider habe ich keinen Anbieter der Daten gefunden der schon vorab alles mit Platzhaltern anzeigt. Im Gegenteil, bei den anderen Anbietern ist es durch Slider oder Tabs noch weiter verschachtelt.
Für die Grün markierten Bereich habe ich in de rRegex jeweils einen Bereich angegeben und zb die Namen nach Runde (also Viertelfinale, Halbfinale etc.) in separate Readings schreiben lassen. Dadurch wird sichergestellt, dass die erste Mannschaft im Viertelfinale auch nach dem hinzufügen des Halbfinales im gleichen reading landet.
Wenn man mal die beiden Motzprobanden ignoriert die nur stänkern wollen und rein gar nichts zum Thema beitrage ohne sich zu wiederholen, ist das Thema eh praktisch durch, da die Playoffs sich ja schon ihrem Ende endgegen neigen und ich nicht unbedingt noch mehr arbeit investieren will. Speziell da nun wieder meine zwei Hater hier auftauchen die schon zum wiederholten Mal gemeldet und nun auch angezeigt wurden.
Danke jedenfalls für die, die wirklich helfen und was bewegen wollen.
Zitat von: Marko1976 am 04 April 2026, 19:38:34ist das Thema eh praktisch durch, da die Playoffs sich ja schon ihrem Ende endgegen neigen und ich nicht unbedingt noch mehr arbeit investieren will
Schön, schön...
Zitat von: Marko1976 am 04 April 2026, 19:38:34Für die Grün markierten Bereich habe ich in de rRegex jeweils einen Bereich angegeben und zb die Namen nach Runde (also Viertelfinale, Halbfinale etc.) in separate Readings schreiben lassen
Es wäre inbesondere bei dem Titel "...HTTPMOD gibt nichts zurück" doch interessant wie du den Teil
gelöst hast und mal konkret die "readingsXX"-Attribute und die resultierenden ReadingsXX nennst - es kommt ja was zurück.
Mache ich natürlich gerne, hier erst mal das komplette List:
Internals:
BUSY 0
DEF https://www.penny-del.org/spiele 18060
FUUID 69c92e07-f33f-7706-0d6e-fa5ceffc3a8a1ca5
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 18060
MainURL https://www.penny-del.org/spiele
ModuleVersion 4.2.0 - 11.8.2023
NAME hockey_playoff
NOTIFYDEV global
NR 578
NTFY_ORDER 50-hockey_playoff
STATE Kölner Haie
TYPE HTTPMOD
eventCount 8
value
CompiledRegexes:
HttpUtils:
NAME
addr https://www.penny-del.org:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.penny-del.org/spiele
header
host www.penny-del.org
httpheader HTTP/1.1 200 OK
date: Mon, 06 Apr 2026 22:17:04 GMT
server: Apache/2.4.52 (Ubuntu)
content-language: de-DE
cache-control: max-age=0
expires: Mon, 06 Apr 2026 22:17:04 GMT
vary: Accept-Encoding
content-encoding: gzip
x-ua-compatible: IE=edge
x-content-type-options: nosniff
content-length: 8955
keep-alive: timeout=5, max=100
content-type: text/html; charset=utf-8
connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /spiele
protocol https
redirects 0
timeout 30
url https://www.penny-del.org/spiele
sslargs:
QUEUE:
READINGS:
2026-04-07 00:17:04 name-1 Kölner Haie
2026-04-07 00:17:04 name-10 Eisbären Berlin
2026-04-07 00:17:04 name-11 EHC Red Bull München
2026-04-07 00:17:04 name-12 ERC Ingolstadt
2026-04-07 00:17:04 name-13 Pinguins Bremerhaven
2026-04-07 00:17:04 name-14 Nürnberg Ice Tigers
2026-04-07 00:17:04 name-15 Grizzlys Wolfsburg
2026-04-07 00:17:04 name-16 Schwenninger Wild Wings
2026-04-07 00:17:04 name-2 Eisbären Berlin
2026-04-07 00:17:04 name-3 Adler Mannheim
2026-04-07 00:17:04 name-4 EHC Red Bull München
2026-04-07 00:17:04 name-5 Kölner Haie
2026-04-07 00:17:04 name-6 Schwenninger Wild Wings
2026-04-07 00:17:04 name-7 Adler Mannheim
2026-04-07 00:17:04 name-8 Pinguins Bremerhaven
2026-04-07 00:17:04 name-9 Straubing Tigers
2026-04-07 00:17:04 nameHF-1 Kölner Haie
2026-04-07 00:17:04 nameHF-2 Eisbären Berlin
2026-04-07 00:17:04 nameHF-3 Adler Mannheim
2026-04-07 00:17:04 nameHF-4 EHC Red Bull München
2026-04-07 00:17:04 nameHF-5 Viertelfinale
2026-04-07 00:17:04 namePPO-1 Pinguins Bremerhaven
2026-04-07 00:17:04 namePPO-2 Nürnberg Ice Tigers
2026-04-07 00:17:04 namePPO-3 Grizzlys Wolfsburg
2026-04-07 00:17:04 namePPO-4 Schwenninger Wild Wings
2026-04-07 00:17:04 nameVF-1 Kölner Haie
2026-04-07 00:17:04 nameVF-2 Schwenninger Wild Wings
2026-04-07 00:17:04 nameVF-3 Adler Mannheim
2026-04-07 00:17:04 nameVF-4 Pinguins Bremerhaven
2026-04-07 00:17:04 nameVF-5 Straubing Tigers
2026-04-07 00:17:04 nameVF-6 Eisbären Berlin
2026-04-07 00:17:04 nameVF-7 EHC Red Bull München
2026-04-07 00:17:04 nameVF-8 ERC Ingolstadt
2026-04-07 00:17:04 seriesF-1 0
2026-04-07 00:17:04 seriesHF-1 0
2026-04-07 00:17:04 seriesHF-2 0
2026-04-07 00:17:04 seriesPPO-1 1
2026-04-07 00:17:04 seriesPPO-2 2
2026-04-07 00:17:04 seriesVF-1 1
2026-04-07 00:17:04 seriesVF-2 1
2026-04-07 00:17:04 seriesVF-3 2
2026-04-07 00:17:04 seriesVF-4 1
2026-04-07 00:17:04 standing-1 0:0
2026-04-07 00:17:04 standing-2 0:0
2026-04-07 00:17:04 standing-3 4:0
2026-04-07 00:17:04 standing-4 4:1
2026-04-07 00:17:04 standing-5 2:4
2026-04-07 00:17:04 standing-6 4:2
2026-04-07 00:17:04 standing-7 2:0
2026-04-07 00:17:04 standing-8 1:2
2026-04-07 00:17:04 standingHF-1 0:0
2026-04-07 00:17:04 standingHF-2 0:0
2026-04-07 00:17:04 standingPPO-1 2:0
2026-04-07 00:17:04 standingPPO-2 1:2
2026-04-07 00:17:04 standingVF-1 4:0
2026-04-07 00:17:04 standingVF-2 4:1
2026-04-07 00:17:04 standingVF-3 2:4
2026-04-07 00:17:04 standingVF-4 4:2
2026-04-07 00:17:04 winnerF-1 0
2026-04-07 00:17:04 winnerHF-1 0
2026-04-07 00:17:04 winnerHF-2 0
2026-04-07 00:17:04 winnerPPO-1 1
2026-04-07 00:17:04 winnerPPO-2 2
2026-04-07 00:17:04 winnerVF-1 1
2026-04-07 00:17:04 winnerVF-2 1
2026-04-07 00:17:04 winnerVF-3 2
2026-04-07 00:17:04 winnerVF-4 1
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.penny-del.org/spiele
defptr:
readingBase:
name-1 reading
name-10 reading
name-11 reading
name-12 reading
name-13 reading
name-14 reading
name-15 reading
name-16 reading
name-2 reading
name-3 reading
name-4 reading
name-5 reading
name-6 reading
name-7 reading
name-8 reading
name-9 reading
nameHF-1 reading
nameHF-2 reading
nameHF-3 reading
nameHF-4 reading
nameHF-5 reading
namePPO-1 reading
namePPO-2 reading
namePPO-3 reading
namePPO-4 reading
nameVF-1 reading
nameVF-2 reading
nameVF-3 reading
nameVF-4 reading
nameVF-5 reading
nameVF-6 reading
nameVF-7 reading
nameVF-8 reading
standing-1 reading
standing-2 reading
standing-3 reading
standing-4 reading
standing-5 reading
standing-6 reading
standing-7 reading
standing-8 reading
standingHF-1 reading
standingHF-2 reading
standingPPO-1 reading
standingPPO-2 reading
standingVF-1 reading
standingVF-2 reading
standingVF-3 reading
standingVF-4 reading
readingNum:
name-1 01
name-10 01
name-11 01
name-12 01
name-13 01
name-14 01
name-15 01
name-16 01
name-2 01
name-3 01
name-4 01
name-5 01
name-6 01
name-7 01
name-8 01
name-9 01
nameHF-1 07
nameHF-2 07
nameHF-3 07
nameHF-4 07
nameHF-5 07
namePPO-1 03
namePPO-2 03
namePPO-3 03
namePPO-4 03
nameVF-1 05
nameVF-2 05
nameVF-3 05
nameVF-4 05
nameVF-5 05
nameVF-6 05
nameVF-7 05
nameVF-8 05
standing-1 02
standing-2 02
standing-3 02
standing-4 02
standing-5 02
standing-6 02
standing-7 02
standing-8 02
standingHF-1 08
standingHF-2 08
standingPPO-1 04
standingPPO-2 04
standingVF-1 06
standingVF-2 06
standingVF-3 06
standingVF-4 06
readingOutdated:
readingSubNum:
name-1 -1
name-10 -10
name-11 -11
name-12 -12
name-13 -13
name-14 -14
name-15 -15
name-16 -16
name-2 -2
name-3 -3
name-4 -4
name-5 -5
name-6 -6
name-7 -7
name-8 -8
name-9 -9
nameHF-1 -1
nameHF-2 -2
nameHF-3 -3
nameHF-4 -4
nameHF-5 -5
namePPO-1 -1
namePPO-2 -2
namePPO-3 -3
namePPO-4 -4
nameVF-1 -1
nameVF-2 -2
nameVF-3 -3
nameVF-4 -4
nameVF-5 -5
nameVF-6 -6
nameVF-7 -7
nameVF-8 -8
standing-1 -1
standing-2 -2
standing-3 -3
standing-4 -4
standing-5 -5
standing-6 -6
standing-7 -7
standing-8 -8
standingHF-1 -1
standingHF-2 -2
standingPPO-1 -1
standingPPO-2 -2
standingVF-1 -1
standingVF-2 -2
standingVF-3 -3
standingVF-4 -4
requestReadings:
update:
name-1 reading 01-1
name-10 reading 01-10
name-11 reading 01-11
name-12 reading 01-12
name-13 reading 01-13
name-14 reading 01-14
name-15 reading 01-15
name-16 reading 01-16
name-2 reading 01-2
name-3 reading 01-3
name-4 reading 01-4
name-5 reading 01-5
name-6 reading 01-6
name-7 reading 01-7
name-8 reading 01-8
name-9 reading 01-9
nameHF-1 reading 07-1
nameHF-2 reading 07-2
nameHF-3 reading 07-3
nameHF-4 reading 07-4
nameHF-5 reading 07-5
namePPO-1 reading 03-1
namePPO-2 reading 03-2
namePPO-3 reading 03-3
namePPO-4 reading 03-4
nameVF-1 reading 05-1
nameVF-2 reading 05-2
nameVF-3 reading 05-3
nameVF-4 reading 05-4
nameVF-5 reading 05-5
nameVF-6 reading 05-6
nameVF-7 reading 05-7
nameVF-8 reading 05-8
standing-1 reading 02-1
standing-2 reading 02-2
standing-3 reading 02-3
standing-4 reading 02-4
standing-5 reading 02-5
standing-6 reading 02-6
standing-7 reading 02-7
standing-8 reading 02-8
standingHF-1 reading 08-1
standingHF-2 reading 08-2
standingPPO-1 reading 04-1
standingPPO-2 reading 04-2
standingVF-1 reading 06-1
standingVF-2 reading 06-2
standingVF-3 reading 06-3
standingVF-4 reading 06-4
Attributes:
alias DEL Play-Off's
enableControlSet 1
group Eishockey
icon Wunderlist
reading01Name name
reading01RegOpt g
reading01Regex <\/div>\s*([\w+öäüÖÄÜ][ \wöäüÖÄÜ]+)\s*<\/div>
reading02Decode utf-8
reading02Name standing
reading02RegOpt g
reading02Regex <h3>(.*)<\/h3>
reading03Name namePPO
reading03RegOpt g
reading03Regex (?:1. Playoff-Runde|(?!\A)\G)[\s\S]*?alt="([^"]+)"(?=[\s\S]*?footer)
reading04Name standingPPO
reading04RegOpt g
reading04Regex (?:1. Playoff-Runde|(?!\A)\G)[\s\S]*?<h3>(.*)<\/h3>(?=[\s\S]*?footer)
reading05Name nameVF
reading05RegOpt g
reading05Regex (?:alt="Viertelfinale"|(?!\A)\G)[\s\S]*?alt="([^"]+)"(?=[\s\S]*?1. Playoff-Runde)
reading06Name standingVF
reading06RegOpt g
reading06Regex (?:Viertelfinale|(?!\A)\G)[\s\S]*?<h3>(.*)<\/h3>(?=[\s\S]*?1. Playoff-Runde)
reading07Name nameHF
reading07RegOpt g
reading07Regex (?:Halbfinale|(?!\A)\G)[\s\S]*?alt="([^"]+)"(?=[\s\S]*?Viertelfinale)
reading08Name standingHF
reading08RegOpt g
reading08Regex (?:Halbfinale|(?!\A)\G)[\s\S]*?<h3>(.*)<\/h3>(?=[\s\S]*?Viertelfinale)
reading09Name nameF
reading09RegOpt g
reading09Regex (?:Finale|(?!\A)\G)[\s\S]*?alt="([^"]+)"(?=[\s\S]*?Halbfinale)
reading10Name standingF
reading10RegOpt g
reading10Regex (?:Finale|(?!\A)\G)[\s\S]*?<h3>(.*)<\/h3>(?=[\s\S]*?Halbfinale)
room Information->Sport
stateFormat name-1
timeout 30
userReadings winnerPPO-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingPPO-1","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 2 && $val2 < 2); return ($val1 > $val2) ? "1" : "2"; }, winnerPPO-2 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingPPO-2","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 2 && $val2 < 2); return ($val1 > $val2) ? "1" : "2"; }, winnerVF-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-1","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, winnerVF-2 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-2","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, winnerVF-3 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-3","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, winnerVF-4 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-4","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, winnerHF-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingHF-1","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, winnerHF-2 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingHF-2","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, winnerF-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingF-1","0:0")); return "0" if ($val1 == $val2); return "0" if ($val1 < 4 && $val2 < 4); return ($val1 > $val2) ? "1" : "2"; }, seriesPPO-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingPPO-1","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesPPO-2 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingPPO-2","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesVF-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-1","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesVF-2 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-2","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesVF-3 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-3","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesVF-4 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingVF-4","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesHF-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingHF-1","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesHF-2 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingHF-2","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; }, seriesF-1 { my ($val1, $val2) = split(":", ReadingsVal($name,"standingF-1","0:0")); return "0" if ($val1 == $val2); return ($val1 > $val2) ? "1" : "2"; },
userattr .*
verbose 3
Das Ganze war ja eine Entwicklungsarbeit die immer weiter - auch der dank der Hilfe hier - voran gekommen ist. Zuerst bekoam ich mit regex101.com Treffer angezeigt, aber die Readings im Device blieben leer, so dass ich keine Lösung hatte weshalb ich die Überschrift so gewählt habe. Im Zuge der Entwicklung ist mir dann aufgefallen, dass die Readings nicht leer waren sondern mit den Leerzeichen gefüllt wurden und in der Weboberfläche von Fhem nur leer aussahen.
Zu deiner konkreten Frage und damit man nicht das ganze List durchgehen muss hier die Regex für die einzelnen Readings als Bildschirmfoto (ist schneller als alle einzelnd in Codeblöcke zu schreiben).:
Screenshot 2026-04-07 020028.jpg
Die Readings lauten damit nun "name" bzw. "standing", jeweils gefolgt von der Rundenbezeichnung, also namePPO, nameVF, nameHF und nameF bzw. das Ganze eben auch beim standing.
Das ergibt für jede Runde eine separate Ausgabe der Mannschaftsnamen udn Serienergebnisse, so dass die erste Mannschaft im Virtelfinale auch die 1. Mannschaft im Viertelfinale bleibt wenn das Halbfinale hinzugefügrt wird/wurde. So kann ich sicherstellen, dass sich die Namen der einelnen Readings eben nicht ändern und auch in meiner grafischen Auswertung im FTUI3 darauf zugreifen ohne Angst haben zu müssen, dass es mir alles zerschießt wenn der Seite die nächste Runde hinzugefügt wird.
Ich hoffe damit sind deine Fragen beantwortet, ansonsten musst du noch mal genauer sagen was du gerne sehen möchtest.