ubuntuusers.de

Regexe-Umwandlung Hypertext- in Wikisyntax

Status: Gelöst | Ubuntu-Version: Ubuntu 6.10 (Edgy Eft)
Antworten |

boerelwei

Anmeldungsdatum:
14. April 2005

Beiträge: 191

Hi,

ich habe folgende Situation: ich möchte die Hyperlinks in einem HTML-Quelltext per regulärem Ausdruck bearbeiten und danach in Mediawikis Linksyntax umwandeln, bin Anfänger und komme nicht weiter. Ich bin dabei, mir http://www.regular-expressions.info/ zu Lernzwecken anzuschauen und nutze Kodos als Regex-Tool.

Ich bin für Tipps dankbar, ich suche keine Komplettlösungen.

Die HTML-Links haben die Form:

<a href="http://web.archive.org/web/20050307150758/http://www.jabber.org/journal/de/2004-02-27.shtml">letzten Ausgabe</a>

Am Ende soll stehen bleiben:

[http://www.jabber.org/journal/de/2004-02-27.shtml letzten Ausgabe]

Meine Fragen:
Ist das mit einer einzigen Regexe möglich oder benötigt man dafür mehrere? Kann man Regexe in einem Ausdruck miteinander verknüpfen?

Für Tipps zur Vorgehensweise bin ich dankbar.

SirSiggi

Avatar von SirSiggi

Anmeldungsdatum:
12. September 2005

Beiträge: 823

Mit PCREs wäre mein Ansatz folgender:

<a href="http://web.archive.org/web/\d+/([^"]*)">([^>]*)</a>

Dann findest du in \1 den Link und in \2 den Text. Dann wäre der Ersetzungstext quasi: [\1 \2]

Das funktioniert natürlich nur so simpel, wenn die Links wirklich immer so aufgebaut sind, ansonsten müsste man bei nicht gleichförmigen Links mit der Greedyness/Gierigkeit einzelner Teile der RegEx spielen, ginge aber auch in einem Zug.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Stellaris hat geschrieben:

Ist das mit einer einzigen Regexe möglich oder benötigt man dafür mehrere? Kann man Regexe in einem Ausdruck miteinander verknüpfen?

sed 's#<a href="http://[a-zA-Z0-9./]*http://\([a-zA-Z0-9./-]*\.shtml\)">\([^<]*\)</a>#[http://\1 \2]#g' infile > outfile
# oder
sed -i 's#<a href="http://[a-zA-Z0-9./]*http://\([a-zA-Z0-9./-]*\.shtml\)">\([^<]*\)</a>#[http://\1 \2]#g' file_to_be_modified


sollte das können.
Mehrere Kommandos können mit ; voneinander getrennt werden:

sed 's/a/o/g;s/u/i/g' file

- scheint mir aber nicht nötig hier.
Die Kommandoteile werden üblicherweise mit / getrennt, aber da wir hier / im Ausdruck haben, (http://) nehme ich lieber den #.
s steht für substitute - substitute#pattern#Ersatz#flag, flag: g: global =mehrfach ersetzen, nicht nur den ersten Fund.
[a-zA-Z0-9\.] ist eine Menge von Zeichen
[^<] ist alles, was kein Kleinerzeichen ist.
\1 ist der vormals mittels (maskierter) Klammern \(...\) gefundene erste Ausdruck, analog \2 der zweite.

boerelwei

(Themenstarter)

Anmeldungsdatum:
14. April 2005

Beiträge: 191

Danke für Eure Tipps bzw. Komplettlösungen. Ich bin in diesem Falle froh, dass nicht auf mich gehört wurde, was die "Komplettlösung" angeht, denn die erste Geschichte konnte ich 1:1 übernehmen, das hat mir eine Menge Zeit gespart.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Ich meine die Lösung hat noch ein paar Lücken.
So ist in URLs ja auch _ möglich; der wird aber noch nicht berücksichtigt.
Oder das #.
Und selbst noch ein wenig suchen... ☺

boerelwei

(Themenstarter)

Anmeldungsdatum:
14. April 2005

Beiträge: 191

Hallo user unknown,

natürlich hast Du Recht dass die Lösung nicht alle Fälle abdeckt und noch generischer gestgaltet werden kann, für meinen speziellen Fall reicht das so aber erstmal, da die Links, die ersetzt werden sollen, keinerlei solcher Sonderzeichen enthalten ☺

Antworten |