愚蠢引用智能引号仅用于文本而不是HTML代码

时间:2013-02-15 11:32:05

标签: javascript html replace quotes

我正在将愚蠢的引号转换为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标记的最佳(最有效)方法是什么?谢谢!

1 个答案:

答案 0 :(得分:4)

这是一种可行的方法(不了解效率,但如果您只处理用户手动输入的字符串,它们可能不会很长,所以它应该没关系):

  1. 将您的字符串拆分为非重叠的块:HTML标记与其他
  2. 仅在非标签中“教育引号”,只保留标签
  3. 将字符串重新组合在一起
  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('');
    

    将替换应用于<>之间的任何位置。