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, ohne die ?-??-? Sequenz.
https://regex101.com/ sagt: Müsste funktionieren.
Rolf
sumpsi - posui - obstruxi
Man weiß ja nicht, ob es der oder die URL ist. Also entgendern wir das zu das URLy 😂 ↩︎