仅针对文本而非 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;
;
什么是仅在用户文本中替换哑引号并跳过像<img src="" />
这样的HTML标签的最佳(最有效)方法?谢谢!
【问题讨论】:
请注意,替换<div>
不会捕获带有属性的 DIV,例如 <div class="...">
。另外,最后一个replace
应该是</p>
。
@fanaugen 哎呀,修复它。我不关心类,只关心某些浏览器在更改格式时插入的 (例如从 到 )
【参考方案1】:这是一种可能的方法(不知道效率,但如果你只处理用户手动输入的字符串,它们可能不会很长,所以应该没关系):
-
将字符串拆分为不重叠的块:HTML 标记与其余部分
“教育引语”仅在非标签中,而单独留下标签
把绳子放回去
如果您正在处理的 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('');
在<
和>
之间以外的任何地方应用您的替换。
【讨论】:
以上是关于仅针对文本而非 HTML 代码将哑引号转换为智能引号的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 iconv 将多字节智能引号转换为扩展的 ASCII 智能引号吗?