I'm trying to use regex to convert Slack's version of markdown formatting to BB Code. I'm stuck on links at the moment. Slack formats like this:
<www.url.com|This is the actual text>
<www.url.com>
BB Code formats like this:
[url=www.url.com]This is the actual text[/url]
[url]www.url.com[/url]
I'm dealing with the first type using this (in javascript)
string.replace(/\<([\s\S]+)(?=\|)\|([\s\S]*?)\>/gm, "[url=$1]$2[/url]"
I'm struggling to make a second rule that will only match text between <...> if there isn't a | in the string. Can anyone help me out?
Also if there's a neat way of dealing with both options in one go then let me know!
You can use
const text = `<www.url.com|This is the actual text>
<www.url.com>`;
console.log( text.replace(/<([^<>|]*)(?:\|([^<>]*))?>/g, (x, url, text) => text !== undefined ?
`[url=${url}]${text}[/url]` : `[url]${url}[/url]`) )
See the regex demo. Details:
< - a < char (please NEVER escape this char in any regex flavor if you plan to match a < char)([^<>|]*) - Group 1: any zero or more chars other than <, > and |(?:\|([^<>]*))? - an optional non-capturing group matching one or zero occurrences of a | and then any zero or more chars other than < and > captured into Group 2> - a > char (again, please never escape the > literal char in any regex flavor).