Regulärer Ausdruck, Ausnahme einfügen
bearbeitet von
Hallo Jörg,
grundsätzlich würde ich vorschlagen, einen negativen Lookahead zu nutzen (sprich: die Regex matcht nicht, wenn der Lookahead matcht). Du müsstest nur festlegen, welche URLs der ausschließen soll. Spontan fallem mir 3 URLs für Youtube ein: youtube.com, youtube.de und youtu.be. Hinzu kommen natürlich noch massig nationale YT-URLs.
Dedlfixens Ansatz müsste man, wenn ich länger drüber nachdenke, so implementieren, dass man zuerst einen Search macht, die URL prüft und nur dann, wenn es keine YT-URL ist, den Replace durchführt.
Was ist das da überhaupt für eine Regex???
`'!(((f|ht)tp(s)?://)[-a-zA-Z?-??-?()0-9@:%_+.~#?&;//=]+)!i'`
Die ' sind Stringbegrenzer?
Die ! sind Regex-Begrenzer?
Demnach wäre das, case insensitive, dies:
`(((f|ht)tp(s)?://)[-a-zA-Z?-??-?()0-9@:%_+.~#?&;//=]+)`
Vorne ist das Schema, ok. Du akzeptierst ftp, http, ftps und https. Mööp. ftps gibt es nicht. Dann kommt ://, okay.
Nun kommt eine Zeichenklasse. Ohne dessen Inhalt zu betrachten, steht da [...]+. Also 1-N Zeichen aus deiner Liste. Für ein URLy[^1] ganz schön großzügig. URLs sind eigentlich viel strenger reglementiert. Aber na gut. Das ist ein anderes Thema.
Deine Zeichenklassendefinition ist merkwürdig. Was sollen die ?-? Intervall? Wenn Du ein ? matchen willst - das hat innerhalb von [] keine Sonderrolle, das kannst Du einfach hinschreiben. Und was soll // ? Der Vorwärtsschrägstrich hat bei Dir keine Sonderrolle mehr, weil Du einen anderen Regex-Delimiter nimmst.
Aber wenn man das alles ignoriert, wäre diese Regex machbar. Ich verteile sie auf 3 Zeilen, um besser erklären zu können. Du musst für Dich eine draus machen.
~~~
((ftp|https?)://
(?!.*youtu(be\.de|be\.com|\.be)([:/]|$))
[-a-zA-Z?-??-?()0-9@:%_+.~#?&;//=]+)
~~~
Zeile 1 matcht das Schema. Dein (f|ht)tp(s)? Konstrukt habe ich so geändert, dass nur ftp, http und https gematcht wird. Für das optionale s braucht es keine Klammern. Es ist andersrum: du musst klammern, wenn das ? auf mehr wirken soll als nur das Zeichen links von sich.
Die zweite Zeile ist der negative Lookahead. Der sieht so aus: (?!...), und das ... ist eine Regex, die ab diesem Punkt **nicht matchen darf**. Ich prüfe da auf `[^/]*youtu(be\.com|be\.de|\.be)`, gefolgt von `([:/]|$)`.
Das heißt: Auf eine Folge von Zeichen **außer dem /** folgt youtube.com, youtube.de oder youtu.be. Dahinter muss ein : oder / folgen, oder das Ende des Eingabestrings. Wenn diese Regex zutrifft, ist der negative Lookahead nicht erfüllt und die ganze Regex matcht nicht.
Die dritte Zeile ist der domain/path/query Matcher, den Du vorher schon hattest.
<https://regex101.com/> sagt: Müsste funktionieren.
[^1]: Man weiß ja nicht, ob es der oder die URL ist. Also entgendern wir das zu das URLy 😂
_Rolf_
--
sumpsi - posui - obstruxi