Pagina 1 van 1

Regex om anchors naar markdown te converteren

Geplaatst: 18 apr 2020, 22:59
door devilkin
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?

Re: Regex om anchors naar markdown te converteren

Geplaatst: 18 apr 2020, 23:20
door liber!
Misschien betere optie dan een regex, een library die html to markdown doet:
https://github.com/domchristie/turndown

Re: Regex om anchors naar markdown te converteren

Geplaatst: 19 apr 2020, 10:21
door cloink
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/

Re: Regex om anchors naar markdown te converteren

Geplaatst: 25 apr 2020, 11:40
door devilkin
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'