将 md 和 html 字符串中是链接的转成可点击链接。
// md
function convertUrlsInMarkdown(input) {
const placeholder = 'UNIQUE_PLACEHOLDER_' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
let protectedLinks = [];
const markdownLinkPattern = /\[([^\[\]]*)\]\((https?:\/\/[^\s)]+)\)/g;
let processedString = input.replace(markdownLinkPattern, (match) => {
protectedLinks.push({ placeholder, original: match });
return placeholder;
});
const urlPattern = /(https?:\/\/[^\s<"]+)/g;
processedString = processedString.replace(urlPattern, (url) => {
const hostname = new URL(url).hostname;
return `[${hostname}](${url})`;
});
protectedLinks.forEach(item => {
processedString = processedString.replace(item.placeholder, item.original);
});
return processedString;
}
// html
export const convertTextLinksToAnchors = (htmlString) => {
const urlPattern = /(?<!<a[^>]*>)(https?:\/\/[^\s<]+)(?![^<]*<\/a>)/gi;
return htmlString.replace(urlPattern, function (match) {
const url = match;
const linkText = new URL(url).hostname;
return `<a href='${url}' target="_blank" >${linkText}</a>`;
});
}