仅针对文本而非 HTML 代码将哑引号转换为智能引号

Posted

技术标签:

【中文标题】仅针对文本而非 HTML 代码将哑引号转换为智能引号【英文标题】:Dumb quotes into smart quotes only for text not HTML code 【发布时间】:2013-01-31 08:58:01 【问题描述】:

我正在将 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;
;

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

【问题讨论】:

请注意,替换 &lt;div&gt; 不会捕获带有属性的 DIV,例如 &lt;div class="..."&gt;。另外,最后一个replace应该是&lt;/p&gt; @fanaugen 哎呀,修复它。我不关心类,只关心某些浏览器在更改格式时插入的 (例如从 到

【参考方案1】:

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

    将字符串拆分为不重叠的块:HTML 标记与其余部分 “教育引语”仅在非标签中,而单独留下标签 把绳子放回去

如果您正在处理的 HTML 格式正确(特别是,如果没有“&lt;”浮动),那么拆分成块很容易:

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

&lt;&gt; 之间以外的任何地方应用您的替换。

【讨论】:

以上是关于仅针对文本而非 HTML 代码将哑引号转换为智能引号的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 iconv 将多字节智能引号转换为扩展的 ASCII 智能引号吗?

使用 PHP 转换所有类型的智能引号

为啥 Xaringan 幻灯片中没有出现智能引号和破折号?

当基本字符串包含双引号时,仅针对 Swift 中 UILabel 的特定范围的点击手势不起作用

MySQL 因卷曲(智能)引号而窒息

将 HTML 代码转换为纯文本,格式可用于文本文件 [重复]