2017-02-10 20 views
2

Итак, я использую Vue.js и хочу отобразить текст, содержащий ссылки. Текст вводится пользователями.Показать ссылки как <a> теги, но не разрешать другие теги?

Пример:

Это сайт www.example.com, который лучше, чем www.oldexample.com

Я хочу, чтобы она появилась как:

Это сайт www.example.com, который лучше, чем www.oldexample.com

Итак, я хочу, чтобы ссылки были гиперссылками. Проблема в том, что это пользовательский ввод, поэтому он должен быть защищен XSS. В настоящее время я отображаю его как текст, поэтому я не могу использовать HTML-теги в нем. Если бы я использовал v-html и обернул все ссылки в тегах a, это было бы слишком опасно, так как пользователи могли бы ввести любой HTML.

Я думал о разделении строки по URL-адресам и обертывания каждой части, которая не является ссылкой в ​​теге span и каждой ссылке в теге a. Но это слишком много обработки, чтобы сделать это только для гиперссылки URL-адресов.

Есть ли более простой способ для этого, то есть XSS безопасен (пользователи не могут вводить другие теги, кроме <a>)?

+1

Проверьте это: http://stackoverflow.com/questions/1500260/detect-urls-in-text-with -javascript –

+0

Вы пытаетесь заменить введенный пользователем текст, как пользователь его вводит, или в другом месте на странице? Замена на месте немного сложна, вам, вероятно, нужна библиотека, которая может токенизировать входные данные для поддержки таких вещей, как backspace, удаление гиперссылки (подумайте о том, как Word/Outlook делает это с гиперссылками в тексте). Под защитой XSS вы имеете в виду пользователей, которые потенциально вводят текст ссылки, например www.gmail.com, который на самом деле имеет href www.steal-my-password.io? –

+0

Это не на месте. У меня есть раздел комментариев, и я хочу сделать ссылки кликабельными. – Cristy

ответ

2

Используйте vue-linkify это создать v-linkified директиву, делать именно то, что вам нужно

new Vue({ 
    el:'#app', 
    data:{ 
    input:'Hello from vuejs.org' 
    } 
}) 
<div id="app"> 
    <input v-model="input"/> 

    <div v-html="input" v-linkified> 
    </div> 

</div> 
+0

Знаете ли вы, что HTML-код HTML или текст? –

+0

Но у него есть директива '' v-html = "input", поэтому это означает, что весь ввод будет 'HTML' или только тегами' a'? – Cristy