Seite 1 von 1

Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 09:00
von motorang
Hi
wegen der Photobucketpanne muss ich Links ersetzen, im Forum und auf der Homepage.
Die Bilder hab ich unter demselben Namen auf meinem webspace abgelegt, aber natürlich ändert sich der URL.

Problem: ich kann nicht 1:1 ersetzen, weil die Photobucketlinks sind manchmal geschachtelt, in der Form

Code: Alles auswählen
[url=photobucketlink123.jpg.html][img]photobucketlink123.jpg[/img][/url]


So einen Link will ich ersetzen durch
Code: Alles auswählen
[img]motoranglink123.jpg[/img]


Problem: wenn ich nur die Bildadresse ersetze (search photobucketlink123.jpg > replace motoranglink123.jpg) dann bleibt die Schachtelung erhalten und ich hab einen toten Link auf der Seite.

Was also weg muss:
Code: Alles auswählen
[url=photobucketlink123.jpg.html]
am Anfang und
Code: Alles auswählen
[/url]
am Ende.

Den Endtext kann ich gut mit search>replace wegkriegen, weil sich da der Text nicht ändert.

Der Anfangstext ist eine harte Nuss für mich. Aber peanuts für einen Profi. Gibt es hier welche?

Ich suche eine regular expression, um in Notepad++ alle Vorkommen mit der Syntax [url=photobucketlink***.jpg.html]zu finden, und durch "nichts" zu ersetzen. Oder in einem anderen unter Windows lauffähigen Freeware-Programm.

seealpenproblem.jpg


Echten Beispieltext hab ich mal als Textdatei hier abgelegt:
http://motorang.com/photobucket/motoran ... ncode1.txt

Ist der erste Beitrag von da:
viewtopic.php?f=9&t=11266&p=207405&hilit=seealpen#p207405

Beispiel:

Die alte Bildadresse ist
Code: Alles auswählen
[url=http://s10.photobucket.com/user/motorang/media/motorang/2014-seealpen/DSC_5964_zps31db5feb.jpg.html][img]http://i10.photobucket.com/albums/a143/motorang/motorang/2014-seealpen/DSC_5964_zps31db5feb.jpg[/img][/url]


Die neue Bildadresse ist
Code: Alles auswählen
[img]http://motorang.com/photobucket/motorang/2014-seealpen/DSC_5964_zps31db5feb.jpg[/img]


Danke

Gryße!
Andreas, der motorang

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 10:29
von peter67
darf man davon ausgehen, dass pro zeile immer nur ein Bilderlink drin ist?

Also sowas

Code: Alles auswählen
[url=photobucketlink123.jpg.html][img]photobucketlink123.jpg[/img][/url]


aber nicht

Code: Alles auswählen
[url=photobucketlink123.jpg.html][img]photobucketlink123.jpg[/img][/url] text dazwischen und dann [url=photobucketlink124.jpg.html][img]photobucketlink124.jpg[/img][/url]


Enden die url teile am Anfang immer mit html?

Ich kenne jetzt das notepad++ nicht, aber im vi (bzw. vim) funktioniert das hier:

Code: Alles auswählen
\[url=.*html\]


der backslash vor den eckigen Klammern, damit sie als Text betrachtet werden. Die dienen ja sonst zum Auflisten von Wertebereichen in der regexp.
z.B.
Code: Alles auswählen
[a-z]*


Achtung: wenn mehr als ein link in einer Zeile enthalten ist, matched das obige pattern from ersten
Code: Alles auswählen
[url=
bis zum
Code: Alles auswählen
.html]
vom letzen link in dieser Zeile. (Stichwort greedy matching)

Gryße
Peter

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 10:39
von Wauschi
Ob deine Reg Ex funktioniert kann man hier einfach testen: https://regex101.com/

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 12:09
von Thomas Heyl
Hallo, signor presidente!

Hat das noch Zeit bis heute Abend? Ich bin ganz gut mit regulären Ausdrücken und Perl-Fan :grin: . Leider unterstützt NP++ nicht den vollen Umfang, aber da gibt's oft die Möglichkeit, in zwei Schritten zu arbeiten. Peters "gierig"-Problem lässt sich mit Fragezeichen nach Teilausdruck lösen, das macht's "non-greedy" :grin: .

my $szSrc = "<html><head><title>Testausgabe</title></head><body><h1>&Uuml;berschrift</h1></body></html>";
$szSrc =~ /(^<.+?>)/;
my $szNonGreedy = $1;

Da findet RegEx dann die erste, schließende, spitze Klammer und nicht die letzte und spuckt nur "<html>" aus.

Cheers, Langer

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 12:16
von motorang
peter67 hat geschrieben:Ich kenne jetzt das notepad++ nicht, aber im vi (bzw. vim) funktioniert das hier:

Code: Alles auswählen
\[url=.*html\]




Hi
das funktioniert schon mal super, wenn nur ein Link pro Zeile drin ist - danke!

Das mit dem Fragezeichen behalt ich im Hinterkopf, aber so kann ich sicher 90% einfach abklicken.

Cool!

Gryße!
Andreas, der motorang

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 12:35
von Thomas Heyl
Noch'n Tipp, Herr Präsident!

Wenn Du die Version mit dem Fragezeichen so aufbaust, dass sie den ersten Link richtig umwandelt (und nur den!), kannst Du das mit "g" hinter dem schließenden RegExp auch auf mehrere solche Links in einer Zeile anwenden (/irgendwas/g). Und mit /m auch auf mehrere Zeilen oder eben mit /gm auf beliebige Menge in beliebig vielen Zeilen :grin: . Ich weiß jedoch nicht, ob das NP++ unterstützt.

Cheers, Langer

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 13:22
von peter67
motorang hat geschrieben:das funktioniert schon mal super, wenn nur ein Link pro Zeile drin ist - danke!


pragmatischer Ansatz, versuche mal jedes
Code: Alles auswählen
[/url]
durch ein
Code: Alles auswählen
[/url]
+ Zeilenumbruch zu ersetzen. Geht eventuell mit
Code: Alles auswählen
\n


Der zeilenumbruch im HTML sollte ja nichts ausmachen, und dann hättest du sicher in jeder Zeile nur mehr einen link.

Re: Regex - brauche Nachhilfe

BeitragVerfasst: Mo 10 Jul, 2017 13:48
von Thomas Heyl
Guter Tipp, Peter!

:smt023 , Langer