2016-02-29 3 views
0

В javascript мы возвращаем строку с замененными символами. Если строка имеет ссылку, не нужно заменять символы для ссылки.Как декодировать ссылку из строки?

Для этого мы используем код:

function Html(text) { 
    var map = { 
     '&': '&', 
     '<': '&lt;', 
     '>': '&gt;', 
     '"': '&quot;', 
     "'": '&#039;' 
    }; 

    var end_text = text.replace(/[&<>"']/g, function(m) { return map[m]; }); 
    console.log(end_text); 
    end_text = end_text.replace(/&lt;a href=&quot;([\/a-zA-Z\s]+)&quot;(\stitle=&quot;[a-zA-Z0-9\s-]+&quot;)?(\sclass=&quot;[a-zA-Z0-9\s-]*&quot;)?&gt;([a-zA-Z\s-]+)&lt;\/a&gt;/g,'<a href="$1"$2$3>$4</a>'); 
    //<a href="$1"$3>$4</a> 

    return end_text; 
} 

var str = '<a href="/homepage/test" title="go-go-go">go-go-go</a>'; 
console.log(Html(str)); 

В первом заменить символы в строке, и чем мы пытаемся расшифровать ссылку в строку. Но мы получаем проблему: мы получаем <a href="/homepage/test" title=&quot;go-go-go&quot;>go-go-go</a> вместо <a href="/homepage/test" title="go-go-go">go-go-go</a>.

Где ошибка и можно ли улучшить код?

+0

. '/ [& <>" ']/'Замена. Может быть, замените после выполнения регулярного выражения href. – sln

ответ

2

Ваше регулярное выражение выполняет именно то, что вы просили: $2 и $3 заменены сами собой, то есть &quot; s!

Таким образом, я не вижу никакого простого способа решения, чтобы достичь того, чего вы хотите.

В противном случае вы могли бы сделать что-то вроде этого:
(отредактирован: теперь включает в себя тест, чтобы закодированные объекты, когда title включает в себя «дома», в соответствии с замечанием ФП в ниже)

function Html(text) { 
 
    var map = { 
 
    '&': '&amp;', 
 
    '<': '&lt;', 
 
    '>': '&gt;', 
 
    '"': '&quot;', 
 
    "'": '&#039;' 
 
    }; 
 

 
    var end_text = text.replace(/[&<>"']/g, function(m) { return map[m]; }); 
 
    console.log(end_text); 
 
    return end_text.replace(/&lt;a ([\s\S]*?)&gt;([a-zA-Z\s-]+)&lt;\/a&gt;/g, 
 
    function(match, tag, content) { 
 
     if (/title=&quot;[\s\S]*home[\s\S]*&quot;/.test(tag)) { 
 
     return match; 
 
     } 
 
     return '<a ' + tag.replace(/&quot;/g, '"') + '>' + 
 
     content.replace(/&quot;/g, '"') + '</a>'; 
 
    } 
 
); 
 
} 
 

 
console.log(Html(// should result with plain HTML 
 
    '<a href="/homepage/test" title="go-go-go">go-go-go</a>' 
 
)); 
 
console.log(Html(// should result keeping encoded entities 
 
    '<a href="/homepage/test" title="go-home">go-go-go</a>' 
 
));

+0

я понимаю, thx) – Nik

+0

вы можете помочь - как добавить слово-исключение в состояние '([a-zA-Z \ s -] +)'? т. е. что строка 'var str = 'go-go-go';' не может обрабатываться при этом условии. 'home' - исключение слова, если у него есть текстовая ссылка, замена не должна работать. Как это сделать? – Nik

+0

@Nik Я не понимаю: вы хотите, чтобы второй '.replace()' не выполнялся, если 'title' включает в себя« home »? – cFreed

Смежные вопросы