我正在将愚蠢的引号转换为contenteditable
中的智能引号,但问题是它还会在HTML元素中替换它们,如:
<a href=“something” title=“something”
因此使它们无效。我想只为用户的文字做这件事。这是捕获。我必须保留原始格式元素,所以我不能做类似的事情:
clean($('#something_container').text());
这会在返回时删除所有HTML元素(格式化)。这是我的代码:
content = clean($('#post_content').html());
$('#post_content').html(content);
// replaces ", ', --, <div> with <p>
function clean(html) {
html = html.replace(/'\b/g, "\u2018") // opening singles
.replace(/\b'/g, "\u2019") // closing singles
.replace(/"\b/g, "\u201c") // opening doubles
.replace(/\b"/g, "\u201d") // closing doubles
.replace(/--/g, "\u2014") // em-dashes
.replace(/<div>/g, "<p>") //<div> to <p>
.replace(/<\/div>/g, "</p>"); //</div> to </p>
return html;
};
仅在用户的文本中替换哑引号并跳过像<img src="" />
这样的HTML标记的最佳(最有效)方法是什么?谢谢!
答案 0 :(得分:4)
这是一种可行的方法(不了解效率,但如果您只处理用户手动输入的字符串,它们可能不会很长,所以它应该没关系):
如果您正在处理的HTML格式正确(特别是,如果没有&#34; <
&#34;浮动),则分割成块很容易:
var html = '<p style="color:red">some "quotes" in here</p>'
var chunks = html.match(/(<.+?>|[^<]+)/g)
// returns Array: ['<p style="color:red">', 'some "quotes" in here', '</p>']
然后,给定处理替换的clean()
函数,您可以说:
cleaned = chunks.map(function(chunk){
return /</.test(chunk) ? chunk : clean(chunk)
}).join('');
将替换应用于<
和>
之间的任何位置。