Я работаю над приложением, в котором пользователь может добавлять комментарии к определенным полям. эти комментарии также могут быть ссылками. Итак, как пользователь, я хочу иметь возможность нажимать на эти ссылки, а не копировать их и вставлять в новую вкладку.
Вот как осуществляется управление formControl. Я думаю, что могу идентифицировать несколько ссылок с помощью регулярных выражений, но как мне сделать их кликабельными?
Спасибо за ответ и помощь заранее.
this.formControl = new FormControl('', [this.params.customValidations(this.params)]);
this.formControl.valueChanges.subscribe(() => {
this.sendStatusToServices();
});






Либо перед сохранением значения поля формы в базе данных, либо перед редактированием полученного тела из базы данных непосредственно перед представлением пользователю вы можете использовать Regex для замены ссылок тегами привязки.
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/ig;
return text.replace(exp,"<a href='$1'>$1</a>");
}
Однако, если вы пытаетесь включить ссылки ВНУТРИ ввода формы (например, текстовый редактор WordPress), это будет немного сложнее. Вам понадобится <textarea>, чтобы включить пользовательские элементы HTML. Затем вам нужно определить, когда пользователь набрал URL-адрес, чтобы вы могли вызвать replaceURLWithHTMLLinks(). Честно говоря, вы должны просто использовать package. Там есть несколько хороших.
Надеюсь это поможет
Используя подход регулярных выражений и канал, я смог придумать что-то вроде ниже. Что я делаю, так это заменяю ссылки тегами гиперссылок, используя правильное регулярное выражение.
регулярное выражение для замены URL взято из здесь
Поддерживает несколько ссылок в одном комментарии.
Вот пример кода трубы
@Pipe({
name: 'comment'
})
export class CommentPipe implements PipeTransform {
constructor(private sanitizer: DomSanitizer){}
transform(value: any, args?: any): any {
const replacedValue = this.linkify(value);
return this.sanitizer.bypassSecurityTrustHtml(replacedValue)
}
// https://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links#21925491
// this method is taken from above answer
linkify(inputText: string) {
var replacedText, replacePattern1, replacePattern2, replacePattern3;
//URLs starting with http://, https://, or ftp://
replacePattern1 = /(\b(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gim;
replacedText = inputText.replace(replacePattern1, '<a href = "$1" target = "_blank">$1</a>');
//URLs starting with "www." (without // before it, or it'd re-link the ones done above).
replacePattern2 = /(^|[^/])(www\.[\S]+(\b|$))/gim;
replacedText = replacedText.replace(replacePattern2, '$1<a href = "http://$2" target = "_blank">$2</a>');
//Change email addresses to mailto:: links.
replacePattern3 = /(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)/gim;
replacedText = replacedText.replace(replacePattern3, '<a href = "mailto:$1">$1</a>');
return replacedText;
}
}
Вот и завершенный stackblitz
Если вам нужны ссылки внутри самого ввода, вы можете попробовать другой подход.
ссылка не обязательно будет начинаться с
httpилиhttpsВозможно этот вопрос о регулярном выражении для распознавания ссылок поможет вам