FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Shadow3561 am 03 Januar 2017, 20:04:50

Titel: (Gelöst) RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 03 Januar 2017, 20:04:50
Hallo,
Ich versuche aus folgendem Reading die URL mit regex zu extrahieren und per userreading an zu zeigen.

Hier mal das Reading

<img src="http://bilder1.n-tv.de/img/incoming/crop19462956/2148672327-cImg_4_3-w250/RTX2VHIZ.jpg" width="250" height="187" align="left"
/>Punktsieg für Donald Trump: Ford gibt seine Pläne auf, in Mexiko ein neues Werk zu errichten. Stattdessen soll viel Geld in eine Fabrik in den USA gesteckt werden.
Und Trump hat sich bereits den nächsten Autokonzern vorgeknöpft.


Nun versuche ich per UserReading die URL zu bekommen.

ImageURLPic:n01_encodedContent.*
{my $ret = ReadingsVal("myNewsTagesschau","n00_encodedContent","");$ret  =~ s/http\..*\.jpg\s/ /g;return $ret;}


Dies klappt jedoch nicht.
Ich bekomme 1:1 das Original Reading angezeigt.

Kann mir (Perl Laie) vielleicht jemand auf die Sprünge helfen?

MfG
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Devender am 03 Januar 2017, 20:49:34
Salü,

versuch es bitte mal so:
((http):\/\/[^\s]+\.(jpe?g))

beim ausprobieren mit https://regex101.com/ (https://regex101.com/) und deinem UserReading habe ich das Ergebnis:
http://bilder1.n-tv.de/img/incoming/crop19462956/2148672327-cImg_4_3-w250/RTX2VHIZ.jpg
zurückbekommen.

Ich bin rein regex Experte stand aber auch schon vor so einem Problem aber mit T&E findet man meist seinen Weg  :D

Grüße,
Dirk
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 04 Januar 2017, 19:10:36
Danke für deine Hilfe und danke für den Link :).

Jetzt habe ich es so probiert wie du es gepostet hast, bekomme jedoch folgende Fehlermeldung im userreading

Error evaluating myNewsTagesschau userReading ImageURLPic: Search pattern not terminated at (eval 6535249) line 1.

Irgendwas scheine ich zu übersehen.
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Devender am 04 Januar 2017, 21:54:56
was sagt das log noch weiter?
Ich komme heute leider nicht dazu es weiter zu analysieren.

Anhand der Meldung ist das Regex nicht abgeschlossen. Da ich jetzt aber nicht genau weiß, wie du es eingesetzt hast ist es schwer zu prüfen.
ggf mal ein List deiner Devices posten damit man das Nachstellen kann.

Grüße,
Dirk
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 05 Januar 2017, 05:54:09
Hallo,
Hier ein etwas gekürztes List vom Device

Internals:
   DEF        http://www.n-tv.de/rss  3600
   INTERVAL   3600
   NAME       myNewsTagesschau
   NEXTUPDATE Thu Jan  5 05:55:00 2017
   NR         1062
   NTFY_ORDER 50-myNewsTagesschau
   STATE      Thu Jan  5 05:48:04 2017
   TYPE       rssFeed
   URL        http://www.n-tv.de/rss
   Helper:
     Dblog:
       State:
         Logdb:
           TIME       1483591685.10106
           VALUE      Thu Jan  5 05:48:04 2017
   Readings:
     2017-01-05 05:48:05   ImageURLPic     Error evaluating myNewsTagesschau userReading ImageURLPic: Search pattern not terminated at (eval 1270507) line 1.

     2017-01-05 05:48:05   f_buildDate     Thu, 05 Jan 2017 05:47:59 +0100
     2017-01-05 05:48:05   f_description
n-tv.de, Nachrichten seriös, schnell und kompetent. Artikel und Videos aus Politik, Wirtschaft, Börse, Sport und News aus aller Welt.
     2017-01-05 05:48:05   f_imageTitle    n-tv.de - Startseite
     2017-01-05 05:48:05   f_imageURL      http://www.n-tv.de/resources/ts24722887-2/ver1-0/img/head_logo.png
     2017-01-05 05:48:05   f_link          http://www.n-tv.de/
     2017-01-05 05:48:05   f_title         n-tv.de - Startseite
     2017-01-05 05:48:05   gzippedFeed     0
     2017-01-05 05:48:05   n00_description Überspülte Deiche, vollgelaufene Keller, zerstörte Boote: Mit voller Wucht trifft die stärkste Sturmflut seit zehn Jahren Schleswig-Holstein und Mecklenburg-Vorpommern. In Küstennähe werden Wasserstände von bis zu 183 Zentimetern über dem Normalpegel gemessen.
     2017-01-05 05:48:05   n00_encodedContent <img src="http://bilder3.n-tv.de/img/incoming/crop19476766/8348676706-cImg_4_3-w250/86979306.jpg" width="250" height="187" align="left" />Überspülte Deiche, vollgelaufene Keller, zerstörte Boote: Mit voller Wucht trifft die stärkste Sturmflut seit zehn Jahren Schleswig-Holstein und Mecklenburg-Vorpommern. In Küstennähe werden Wasserstände von bis zu 183 Zentimetern über dem Normalpegel gemessen.
   
.....
....... 
     
     
Attributes:
   rfEncode   utf8
   rfMaxLines 5
   rfReadings title,description,pubDate,link,buildDate,imageTitle,imageURL,encodedContent
   room       Server
   userReadings ImageURLPic:n00_encodedContent.* {my $ret = ReadingsVal("myNewsTagesschau","n01_encodedContent","");$ret  =~ ((http):\/\/[^\s]+\.(jpe?g))g; return $ret;}


Ich hoffe es ist ausreichend.

Mein log sagt nur das selbe wie auch im Userreading steht.

Mfg
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: dev0 am 05 Januar 2017, 06:36:24
Die regexp muss in m/.../ einfasst werden. Der Modifier (g) kommt dahinter.
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 05 Januar 2017, 09:13:40
Hallo, das habe ich bereits probiert.

;$ret =~ m/ ((http):\/\/[^\s]+\.(jpe?g))/g; return $ret;}

Dies liefert mir leider das komplette Reading als userreading zurück
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: dev0 am 05 Januar 2017, 10:46:58
Klar: 'return $ret' liefert Dir den kompletten String zurück, Du hast ja nichts ersetzt.

Entweder per s/search/replace/ suchen und ersetzen, dann kannst Du $ret zuckrück geben oder m/foo(bla)/ matchen, dann mußt Du den capture buffer zurückgeben mit $1 etc...

https://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 05 Januar 2017, 19:38:04
Irgendwie stelle ich mich wohl zu dusselig an.

Habe es jetzt so versucht

ImageURLPic:n01_encodedContent.*
{my $ret = ReadingsVal("myNewsTagesschau","n00_encodedContent","");$ret  =~ m/foo((http):\/\/[^\s]+\.(jpe?g))/g;return $1;}


Das liefert mir aber auch nur ein

Error evaluating myNewsTagesschau userReading ImageURLPic: syntax error at (eval 140082) line 1, near "m/foo(" zurück.


Habe mir deinen Link mal angesehen und auch versucht zu verstehen.

Laut meiner Auffassung könnte es dann auch so aussehen

ImageURLPic:n01_encodedContent.*
{my $url = ReadingsVal("myNewsTagesschau","n00_encodedContent","");$1 =~ m/ /\http:(.*)\jpg/g;return $1;}


Das ändert aber auch nichts.
Diese Beispiel ist im verlinkten RegEx Tester auch fehlerhaft.

Was zur Hölle mache ich nur falsch.

Titel: Antw:RegEx Hilfe erbeten
Beitrag von: dev0 am 06 Januar 2017, 07:08:27
Zitat von: Shadow3561 am 05 Januar 2017, 19:38:04
Diese Beispiel ist im verlinkten RegEx Tester auch fehlerhaft.

Die regex habe ich mir nicht näher angesehen, aber der perl code ist nicht ok und das wird auch im log stehen...
und der Begriff 'foo' ist nur ein Beispiel und gehört nicht in die regex.

So ist die perl Syntax ok, die regexp und den capture buffer (die Klammern) mußt Du austesten, das habe ich mir nicht näher angesehen:

{ ReadingsVal("myNewsTagesschau","n00_encodedContent","") =~ m/((http):\/\/[^\s]+\.(jpe?g))/;; $1 }
Titel: Antw:RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 06 Januar 2017, 09:40:37
Danke für deine Hilfe.

Jetzt klappt es wie gewollt.
Dann werde ich mich jetzt mal auf den Hosenboden setzen und ein wenig Perl lernen.

Danke
Titel: Antw:(Gelöst) RegEx Hilfe erbeten
Beitrag von: dev0 am 06 Januar 2017, 09:48:06
Diese deutsche perl Einführung ist, neben den Regexp Grundlagen, mMn auch so zu empfehlen: https://wiki.selfhtml.org/wiki/Perl
Titel: Antw:(Gelöst) RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 08 Januar 2017, 12:32:03
Moin,  so ganz gelöst ist es wohl doch noch nicht.
Ich bekomme im Log noch eine Menge Fehler.

2017.01.08 11:31:25 1: ERROR evaluating http://bilder4.n-tv.de/img/incoming/crop19496931/2688672929-cImg_4_3-w250/a759396318e3d89649ef9b1c94a1ceee.jpg: Unknown regexp modifier "/b" at (eval 2889756) line 1, at end of line
Regexp modifiers "/l" and "/d" are mutually exclusive at (eval 2889756) line 1, at end of line
Unknown regexp modifier "/e" at (eval 2889756) line 1, at end of line
Unknown regexp modifier "/r" at (eval 2889756) line 1, at end of line
Unknown regexp modifier "/4" at (eval 2889756) line 1, at end of line
Bareword "n" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "tv" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "de" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "img" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "incoming" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "crop19496931" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "cImg_4_3" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "w250" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "a759396318e3d89649ef9b1c94a1ceee" not allowed while "strict subs" in use at (eval 2889756) line 1.
Bareword "jpg" not allowed while "strict subs" in use at (eval 2889756) line 1.


Habe die Regex jetzt wie folgt verändert und warte mal ab.
Ich denke die o.A. Regex war, oder ist, zu gierig.

m/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/

Evtl kann ja jemand mal drüber schauen ob es so besser gelöst ist.

Mfg
Titel: Antw:(Gelöst) RegEx Hilfe erbeten
Beitrag von: dev0 am 08 Januar 2017, 12:46:57
Zitat von: Shadow3561 am 08 Januar 2017, 12:32:03
m/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/
Evtl kann ja jemand mal drüber schauen ob es so besser gelöst ist.

Die regexp ist einfach nur krank. Sorry, das musst Du selbst debuggen oder Du findest hier einen Masochist. ;)
Titel: Antw:(Gelöst) RegEx Hilfe erbeten
Beitrag von: Shadow3561 am 08 Januar 2017, 13:20:20
 8)
Brauche keinen Masochisten mehr >:(

Diese Regex wirf leider genau die selben Fehler im Log.

Also alles wieder zurück auf Start.
Titel: Antw:(Gelöst) RegEx Hilfe erbeten
Beitrag von: Devender am 08 Januar 2017, 16:55:28
Probier es doch mal direkt über perl auf der Unix Ebene mit der Reges und deinem Input.
Die Fehler sehen mir stark nach fehlenden Abschlüssen aus. ggf auch vergessenes ausqeuoten von Steuerzeichen...