Die Funktion IsUrl() streikt bei einem Doppelpunkt Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Johnny R
Posts: 269
Joined: 03 Oct 2013, 02:07

Die Funktion IsUrl() streikt bei einem Doppelpunkt

01 Dec 2019, 08:30

In dem schönen Script Get the URL of the current (active) browser tab von atnbueno gibt es die RegEx-Funktion IsUrl():

Code: Select all

IsURL(sURL) {
	Return RegExMatch(sURL, "^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d+))?/?(?<Path>(?:[^:/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$")
}
Die Funktion funktioniert in der Regel auch, streikt aber bei Urls, die einen Doppelpunkt enthalten, also z. B. bei der deutschen Wikipedia-Hauptseite

Code: Select all

https://de.wikipedia.org/wiki/Wikipedia:Hauptseite
Kann bitte jemand von Euch so viel RegEx, dass IsUrl() auch Urls mit einem Doppelpunkt akzeptiert?
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

02 Dec 2019, 03:38

Ich hab bei den verbotenen Zeichen im Pfadteil den Doppelpunkt herausgenommen

Code: Select all

t0:="Oi)^(?<Protocol>https?|ftp)://"
. "(?<Domain>(?:[\w-]+\.)+\w\w+)"
. "(?::(?<Port>\d+))?"
. "/?(?<Path>(?:[^/?# ]*/?)+)"  ;  original "/?(?<Path>(?:[^:/?# ]*/?)+)"
. "(?:\?(?<Query>[^#]+)?)?"
. "(?:\#(?<Hash>.+)?)?$"      

url=https://de.wikipedia.org:8080/wiki/Wikipedia:Hauptfenster
b:=RegExMatch(URL,t0,test)
msgbox, %  "Protocol " test.value(1) "`nDomain " test.value(2) "`nPort " test.value(3) "`nPath " test.value(4) "`nBool " b

Msgbox, % IsURL(URL)
  return
  
 IsURL(sURL) {
	Return RegExMatch(sURL, "^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d+))?/?(?<Path>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$")
}
just me
Posts: 6567
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

02 Dec 2019, 03:50

Moin,

mir erscheint das etwas 'grob', aber ich habe kaum Informationen zur Nutzung von Doppelpunkten im 'Pfad' gefunden, sodass ich auch gerade solch einen Vorschlag einstellen wollte. Ich glaube aber gelesen zu haben, dass das erste Segment des Pfads (hier: wiki) keinen Doppelpunkt enthalten darf.
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

02 Dec 2019, 05:00

Ja, ist wohl etwas grob. Den Doppelpunkt in der url finde ich auch etwas Gewöhnungsbedürftig. Wie wärs mit dem Regexp hier: https://gist.github.com/dperini/729294 :)

Beim Port wäre \d{2,5} sicher auch noch besser.
Johnny R
Posts: 269
Joined: 03 Oct 2013, 02:07

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 04:32

Vielen Dank! Meine neue Funktion sieht jetzt so aus und funktioniert auch mit Doppelpunkten:

Code: Select all

; Geänderte Fassung von IsURL(); vgl.: https://www.autohotkey.com/boards/viewtopic.php?f=9&t=70336
IsURL(sURL) {
   Return RegExMatch(sURL, "^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d+))?/?(?<Path>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$")
}
Warum ist der neue Code "etwas grob"? Ich habe es sonst eher mit dem Zarten, Schmeichelhaften und Anmutigen... :)
just me
Posts: 6567
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 05:29

Johnny R wrote:Warum ist der neue Code "etwas grob"? Ich habe es sonst eher mit dem Zarten, Schmeichelhaften und Anmutigen... :)

Moin, mein 'grob' bezog sich in erster Linie auf die Art und Weise, wie der Doppelpunkt zugelassen wird. Ich glaube, dass ein Doppelpunkt im ersten Pfadsegment, zwei aufeinanderfolgende Doppelpunkte und möglicherweise auch mehrere Doppelpunkte in einem Pfadsegment nicht zulässig sind. Der RegEx lässt das aber zu.
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 05:40

:lol:
Die korrekte Definition einer url (korrekter uri) ist gar nicht so einfach.
just me hat das sofort gesehen. ..Ich hab jetzt auch mal recherchiert, und in der RFC das untenstehende gefunden.
Eine nicht korrekte url z.B https://de.wikipedia.org/wiki:test/Wikipedia:Hauptfenster hält unser regulärer Ausdruck leider für korrekt.
und der originale Ausdruck hält das richtige https://de.wikipedia.org/wiki/Wikipedia:Hauptfenster für falsch.
Bei regular expressions reicht es bei mir leider auch noch nicht sehr weit.

https://tools.ietf.org/html/rfc3986#section-3.3

In addition, a URI reference
(Section 4.1) may be a relative-path reference, in which case the
first path segment cannot contain a colon (":") character.

https://tools.ietf.org/html/rfc3986#section-4.1

A path segment that contains a colon character (e.g., "this:that")
cannot be used as the first segment of a relative-path reference, as
it would be mistaken for a scheme name. Such a segment must be
preceded by a dot-segment (e.g., "./this:that") to make a relative-
path reference.
==========
Übersetzungsversuch (Deepl.com)
============
https://tools.ietf.org/html/rfc3986#section-3.3

Eine URI-Referenz (Abschnitt 4.1) kann zusätzlich eine relative Pfadreferenz sein,
in diesem Fall wird darf das erste Pfadsegment kein Doppelpunkt (":") Zeichen enthalten.

https://tools.ietf.org/html/rfc3986#section-4.1

Ein Pfadsegment, das ein Doppelpunkt-Zeichen enthält (z.B. "dies:das"),
kann nicht als erstes Segment einer relativen Pfadreferenz verwendet werden,
da es mit einem Schema-Namen verwechselt würde.
Einem solches Segment muss ein Punkt-Segment (z.B. "./this:that")
als relativer Pfadverweis vorangestellt sein.
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt  Topic is solved

03 Dec 2019, 07:01

Hier noch ein erweiterter regulärer Ausdruck. Er schaut nach ob im ersten Teil des Pfades kein Doppelpunkt ist /?(?!.*:.*/) . Nur dann gehts weiter.

Code: Select all

t0:="Oi)^(?<Protocol>https?|ftp)://"
. "(?<Domain>(?:[\w-]+\.)+\w\w+)"
. "(?::(?<Port>\d{2,5})(?!\d+/))?"     ;   "(?::(?<Port>\d+))?"  Höchste Portnummer ist 65.535. Funktioniert auch nur beschränkt (:808080/wiki ok; :808080 falsch)

. "/?(?!.*:.*/)(?<Path1>(?:[^:/?# ]*/?))"  ;  original "/?(?<Path>(?:[^:/?# ]*/?)+)"
. "/?(?<Path2>(?:[^/?# ]*/?)+)"

. "(?:\?(?<Query>[^#]+)?)?"
. "(?:\#(?<Hash>.+)?)?$"         
      

url=https://de.wikipedia.org:8080/wiki/Wikipedia:Hauptfenster
;url=https://de.wikipedia.org:8080/wiki:test/Wikipedia:Hauptfenster -> wird korrekt nicht als url erkannt. 
b:=RegExMatch(URL,t0,test)
msgbox, %  test.value(0) "`nProtocol " test.value(1) "`nDomain " test.value(2) "`nPort " test.value(3) "`nPath1 " test.value(4) "`nPath2 " test.value(5) "`nBool " b
Johnny R
Posts: 269
Joined: 03 Oct 2013, 02:07

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 07:49

Hallo haichen,
Dein neuer RegEx erkennt die unrichtige Url "https://de.wikipedia.org:8080/wiki:test/Wikipedia:Hauptfenster" bei mir sehr wohl als zulässig an!
Grüße, JR

Code: Select all

IsURL(sURL) {
   Return RegExMatch(sURL, "^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d{2,5})(?!\d+/))?/?(?!.*:.*/)(?<Path1>(?:[^:/?# ]*/?))/?(?<Path2>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$")
}
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 09:42

Ich habs gerade aus dem Forum (von dir) in eine eigene Testdatei kopiert. Bei mir ist das Ergebnis für richtig.

Code: Select all

url1=https://de.wikipedia.org:8080/wiki:test/Wikipedia:Hauptfenster 
url2=https://de.wikipedia.org:8080/wiki/Wikipedia:Hauptfenster

msgbox, % IsURL(URL1) IsURL(URL2) ;Resultat 01
return

IsURL(sURL) {
   Return RegExMatch(sURL, "^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d{2,5})(?!\d+/))?/?(?!.*:.*/)(?<Path1>(?:[^:/?# ]*/?))/?(?<Path2>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$")
}
Johnny R
Posts: 269
Joined: 03 Oct 2013, 02:07

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 12:32

Hallo haichen,
Funktioniert wunderbar! Das war wohl mein Fehler. Entschuldige.
Vielen Dank! JR
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

03 Dec 2019, 14:23

Schön, freut mich das es funktioniert.😁
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

04 Dec 2019, 05:58

Ich hatte Lust hier auch die Portnummern von 1-65535 abzudecken. Falls die 0 auch dazugehört, oder die Portnummern in einer url erst ab 10 zählen, kann man das einfach ändern.
url1=https://de.wikipedia.org:0/wiki/Wikipedia:Hauptfenster
url2=https://de.wikipedia.org:1/wiki/Wikipedia:Hauptfenster
url3=https://de.wikipedia.org:65536/wiki/Wikipedia:Hauptfenster
url4=https://de.wikipedia.org:65535/wiki/Wikipedia:Hauptfenster
url5=https://de.wikipedia.org:65535
url6=https://de.wikipedia.org:65535/wiki:test/
msgbox, % IsURL(URL1) IsURL(URL2) IsURL(URL3) IsURL(URL4) IsURL(URL5) IsURL(URL6) ;erwartetes Resultat 010110

return

IsURL(sURL) {
Return RegExMatch(sURL, "iO)^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d{1,5})(?!\d+/))?/?(?!.*:.*/)(?<Path1>(?:[^:/?# ]*/?))/?(?<Path2>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$",SubPat)*(SubPat.port<=65535)and(SubPat.port>0)
}
User avatar
nnnik
Posts: 4329
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

04 Dec 2019, 10:09

Danke - habe es auch in mein Skript eingebaut :thumbup:
Recommends AHK Studio
Johnny R
Posts: 269
Joined: 03 Oct 2013, 02:07

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

04 Dec 2019, 11:33

@haichen, vielen Dank! Es gibt offenbar wirklich nichts gutes, was sich nicht doch noch verbessern lässt...
Johnny R
Posts: 269
Joined: 03 Oct 2013, 02:07

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

05 Dec 2019, 07:36

Ich muss leider berichten, dass die letzte Fassung des RegEx bei mir aus völlig klandestinen Gründen einen Fehler 0x800706B5 - Die Schnittstelle ist unbekannt in atnbuenos Script beim Aufruf bestimmter ACC-Funktionen erzeugt:

Code: Select all

---------------------------
ShortCut.ahk
---------------------------
Error in #include file "A:\System\AHK\ACC.ahk":
     0x800706B5 - Die Schnittstelle ist unbekannt.
Source:		(null)
Description:	(null)
HelpFile:		(null)
HelpContext:	0

Specifically: accChildCount

	Line#
	110: Return,p=""?setting:setting:=p
	111: }
	112: {
	113: if ComObjType(Acc,"Name") != "IAccessible"  
	114: ErrorLevel := "Invalid IAccessible Object"
	115: Else
	115: {
--->	116: Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]  
	117: if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0  
	117: {
	118: Loop,%cChildren%
	119: i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):  
	120: Return,Children.MaxIndex()?Children:
	121: }
	121: Else

Continue running the script?
---------------------------
Ja   Nein   
---------------------------
Die vorletzte Fassung des RegEx erzeugt diesen Fehler nicht, weshalb ich diese wiederhergestellt habe.
User avatar
nnnik
Posts: 4329
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

05 Dec 2019, 08:04

Das Skript an sich ist leicht problematisch. Ich habe eine Version die anders strukturiert ist und von daher keinerlei Probleme verursachen sollte.
Ich werde sie später mal raussuchen.
Recommends AHK Studio
just me
Posts: 6567
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

05 Dec 2019, 09:25

Moin,

ich würde denken, dass die letzte Version von haichen

Code: Select all

*(SubPat.port<=65535)and(SubPat.port>0)
nur dann funktioniert, wenn die URL tatsächlich eine Portangabe in diesem Bereich enthält.

-> Ohne Port sieht's düster aus!
haichen
Posts: 224
Joined: 09 Feb 2014, 08:24

Re: Die Funktion IsUrl() streikt bei einem Doppelpunkt

05 Dec 2019, 10:48

Uuuh Mist. Danke just me, das du da noch mal drüber geschaut hast.
Meine Lösung (Erleuchtung in der Düsternis :idea:):

Code: Select all

*((SubPat.port<=65535) and (SubPat.port>0) or (SubPat.port=""))
Ist das besser?

Hier noch mal komplett:

Code: Select all

url1=https://de.wikipedia.org:0/wiki/Wikipedia:Hauptfenster         ;0
url2=https://de.wikipedia.org:1/wiki/Wikipedia:Hauptfenster         ;1
url3=https://de.wikipedia.org:65536/wiki/Wikipedia:Hauptfenster     ;0
url4=https://de.wikipedia.org:65535/wiki/Wikipedia:Hauptfenster     ;1
url5=https://de.wikipedia.org:65535                                 ;1
url6=https://de.wikipedia.org:65535/wiki:test/                      ;0
url7=https://de.wikipedia.org/wiki/Wikipedia:Hauptfenster           ;1
url8=https://de.wikipedia.org                                       ;1
msgbox, % IsURL(URL1) IsURL(URL2) IsURL(URL3) IsURL(URL4) IsURL(URL5) IsURL(URL6) IsURL(URL7) IsURL(URL8) ;Resultat 01011011

return

IsURL(sURL) {
   Return RegExMatch(sURL, "iO)^(?<Protocol>https?|ftp)://(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d{1,5})(?!\d+/))?/?(?!.*:.*/)(?<Path1>(?:[^:/?# ]*/?))/?(?<Path2>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$",SubPat)*((SubPat.port<=65535) and (SubPat.port>0) or (SubPat.port=""))
}

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 22 guests