2

我在 a 中将哑引号转换为智能引号,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;
};

什么是仅在用户文本中替换哑引号并跳过 HTML 标签的最佳(最有效)方法<img src="" />?谢谢!

4

1 回答 1

4

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

  1. 将您的字符串拆分为不重叠的块:HTML 标签与其余部分
  2. 仅在非标签中“教育引语”,不理会标签
  3. 把绳子重新放在一起

如果您正在处理的 HTML 格式正确(特别是,如果没有 " <" 浮动),则拆分为块很容易:

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('');

<在和之间以外的任何地方应用您的替换>

于 2013-02-15T12:13:26.107 回答