Regex om anchors naar markdown te converteren

Plaats reactie
Gebruikersavatar
devilkin
Elite Poster
Elite Poster
Berichten: 4884
Lid geworden op: 17 mei 2006, 20:10
Uitgedeelde bedankjes: 551 keer
Bedankt: 341 keer
Contacteer:
Provider

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: 783
Lid geworden op: 09 apr 2006, 17:48
Twitter: nathan_gs
Uitgedeelde bedankjes: 130 keer
Bedankt: 55 keer
Provider

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: 3515
Lid geworden op: 29 okt 2007, 10:29
Twitter: cloink
Uitgedeelde bedankjes: 93 keer
Bedankt: 137 keer
Contacteer:
Provider

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
Elite Poster
Elite Poster
Berichten: 4884
Lid geworden op: 17 mei 2006, 20:10
Uitgedeelde bedankjes: 551 keer
Bedankt: 341 keer
Contacteer:
Provider

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”