Представьте, что ваш пользователь пишет сообщение и включает одну или две гиперссылки где-нибудь в тексте. Все это сохраняется в базе данных в виде строки. Чтобы отобразить контент и сделать ссылки доступными для кликов, нужно сделать следующее:
const urlRegex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
let content = userInput = "Hey everybody, look at this cool site I found: http://www.cool-site.com"
let url = content.match(urlRegex);
.postContents !{content.replace(url[0], `<a href="${url[0]}">${url[0]}</a>`)}
Маркер! {} Гарантирует, что Pug рассматривает теги html так, как они есть. Однако такой подход непрактичен. Злоумышленник может легко опубликовать <a href="www.u-r-hacked.com">Click me!</a>
, и Паг возьмет эту строку и отобразит ее, потому что содержимое не экранируется. С другой стороны, если я экранирую содержимое, рекурсивно добавленный тег <a href="blahblah">blahblah</a>
будет рассматриваться как текст, и никакие ссылки не будут доступны для нажатия. Одно из решений, о котором я подумал, - это разложить всю строку на массив слов, чтобы позже перекомпоновать ее снова, используя # {} для не-URL-адресов и! {} Для URL-адресов, хотя это кажется довольно сложным для проблемы, с которой могли столкнуться многие другие разработчики. уже.
Примечание: я знаю, что код не перебирает все совпадающие URL. Я выясню это позже. Моя проблема сейчас состоит в том, чтобы найти способ безопасного "URL-адреса" текста.