I need the parse text with links in the following formats:
[html title](http://www.htmlpage.com)
http://www.htmlpage.com
https://i.stack.imgur.com/rDDPu.jpg
The output for those two strings would be:
<a href='http://www.htmlpage.com'>html title</a>
<a href='http://www.htmlpage.com'>http://www.htmlpage.com</a>
<a href='https://i.stack.imgur.com/rDDPu.jpg'>https://i.stack.imgur.com/rDDPu.jpg</a>
The string could include an arbitrary amount of these links, ie:
[html title](http://www.htmlpage.com)[html title](http://www.htmlpage.com)
[html title](http://www.htmlpage.com) [html title](http://www.htmlpage.com)
[html title](http://www.htmlpage.com) wejwelfj http://www.htmlpage.com
output:
<a href='http://www.htmlpage.com'>html title</a><a href='http://www.htmlpage.com'>html title</a>
<a href='http://www.htmlpage.com'>html title</a> <a href='http://www.htmlpage.com'>html title</a>
<a href='http://www.htmlpage.com'>html title</a> wejwelfj <a href='http://www.htmlpage.com'>http://www.htmlpage.com</a>
I have an extremely long function that does an alright job by passing over the string 3 times, but I can’t successfully parse this string:
[This](http://i.imgur.com/iIlhrEu.jpg) one got me crying first, then once the floodgates were opened [this](http://i.imgur.com/IwSNFVD.jpg) one did it again and [this](http://i.imgur.com/hxIwPKJ.jpg). Ugh, feels. Gotta go hug someone/something.
For brevity, I’ll post the regular expressions I’ve tried rather than the entire find/replace function:
var matchArray2 = inString.match(/\[.*\]\(.*\)/g);
for matching [*](*), doesn’t work because []()[]() is matched
Really that’s it, I guess. Once I make that match I search that match for () and [] to parse out the link an link text and build the href tag. I delete matches from a temp string so I don’t match them when I do my second pass to find plain hyperlinks:
var plainLinkArray = tempString2.match(/http\S*:\/\/\S*/g);
I’m not parsing any html with regex. I’m parsing a string and attempting to output html.
edit: I added the requirement that it parse the third link https://i.stack.imgur.com/rDDPu.jpg after the fact.
my final solution (based on @Cerbrus’s answer):
function parseAndHandleHyperlinks(inString)
{
var result = inString.replace(/\[(.+?)\]\((https?:\/\/.+?)\)/g, '<a href="$2">$1</a>');
return result.replace(/(?: |^)(https?\:\/\/[a-zA-Z0-9/.(]+)/g, ' <a href="$1">$1</a>');
}
Try this regex:
Regex Explanation:
Now the 2 strings in the
() / []are captured, and placed in the following string:This works for your "problematic" string:
Some more examples with "Incorrect" input:
You can’t really blame the last line for breaking, since there’s no way to know if the user meant to stop the url there, or not.
To catch loose urls, add this:
The
(?: |^)bit catches aString startorspacecharacter, so it’ll also match lines starting with a url.