Regex om anchors naar markdown te converteren

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Gebruikersavatar
devilkin
Administrator
Administrator
Berichten: 7090
Lid geworden op: 17 mei 2006, 20:10
Uitgedeelde bedankjes: 1086 keer
Bedankt: 694 keer
Recent bedankt: 13 keer
Provider
Te Koop forum

Hoi,

Ik heb m'n bestaande blog omgezet naar static site via Jekyll, en ben nu bezig met de content wat op te schonen. Ook alle html eruit te halen en te converteren naar markdown.

Ik zit nu te vechten met een sed-regex om overal de anchors te converteren naar markdown... en ik krijg het maar niet goed.

Practisch voorbeeld:

Code: Selecteer alles

$ cat /tmp/test
on <a href="https://www.reddit.com/" target="_blank" rel="noopener">reddit</a> or <a href="https://lifehacker.com/" target="_blank" rel="noopener">Lifehacker</a>

Code: Selecteer alles

$ sed -r 's/<a.*?href="(.*?)".*?>(.*?)<\/a>/[\2](\1)/g' /tmp/test 
on [Lifehacker](https://lifehacker.com/" target="_blank" rel="noopener)
Wat ik zou willen is dat die alles dropt wat niet in de href staat, en ook meerdere op een lijn meepakt. Voor een of andere bizarre reden krijg ik enkel de laatste gematched, en dan nog foutief.

Had al wat zitten zoeken oa ook via Regex101 - en volgens mij klopt het wel, maar toch doet sed er iets raars mee.

Anyone a clue?
Telenet All-Internet -- using CV8560E & OPNsense on PCEngines APU2E4
Proximus & Mobile Vikings -- Using OnePlus 8 Pro (ROM: Stock)
liber!
Elite Poster
Elite Poster
Berichten: 988
Lid geworden op: 09 apr 2006, 17:48
Twitter: nathan_gs
Uitgedeelde bedankjes: 285 keer
Bedankt: 98 keer
Te Koop forum

Misschien betere optie dan een regex, een library die html to markdown doet:
https://github.com/domchristie/turndown
Gebruikersavatar
cloink
Elite Poster
Elite Poster
Berichten: 3698
Lid geworden op: 29 okt 2007, 10:29
Twitter: cloink
Uitgedeelde bedankjes: 117 keer
Bedankt: 152 keer
Contacteer:
Provider
Te Koop forum

Ik gebruik sed niet, maar je regex ziet er goed uit ja. Misschien de "extended" flag eens proberen?
sed -E 's/<a.*?href="(.*?)".*?>(.*?)<\\/a>/[\2](\1)/g;t;d'

Als je sed perse moet gebruiken, kan je dit debug-script misschien eens proberen? https://aurelio.net/projects/sedsed/
ooh. shiny.
Gebruikersavatar
devilkin
Administrator
Administrator
Berichten: 7090
Lid geworden op: 17 mei 2006, 20:10
Uitgedeelde bedankjes: 1086 keer
Bedankt: 694 keer
Recent bedankt: 13 keer
Provider
Te Koop forum

liber! schreef:Misschien betere optie dan een regex, een library die html to markdown doet:
https://github.com/domchristie/turndown
Merci voor de link, maar ik voel er weinig voor om nu specifiek voor deze usecase te gaan zitten klooien met nodejs ;)

cloink schreef:Ik gebruik sed niet, maar je regex ziet er goed uit ja. Misschien de "extended" flag eens proberen?
sed -E 's/<a.*?href="(.*?)".*?>(.*?)<\\/a>/[\2](\1)/g;t;d'

Als je sed perse moet gebruiken, kan je dit debug-script misschien eens proberen? https://aurelio.net/projects/sedsed/
Sed, awk, whatever works, zolang het maar recursief en snel is ;) Heb die sedsed nog niet helemaal aan de praat gekregen, zodadelijk eens verder prullen.

EDIT: Dankzij StackOverflow heb ik uiteindelijk de reden gevonden:
sed ondersteund geen non-greedy regexes. Oplossing met sed:

Code: Selecteer alles

sed -E 's/<a[^>]*href="([^"]*)[^>]*>([^<]*)[^>]*>/[\2](\1)/g'
Oplossing met perl (welke wel non-greedy kan):

Code: Selecteer alles

perl -pe 's/<a.*?href="(.*?)".*?>(.*?)<\/a>/[\2](\1)/g'
Telenet All-Internet -- using CV8560E & OPNsense on PCEngines APU2E4
Proximus & Mobile Vikings -- Using OnePlus 8 Pro (ROM: Stock)
Plaats reactie

Terug naar “Development”