愚蠢的引号变成聪明的引号Javascript问题

Dumb quotes into smart quotes Javascript issue

本文关键字:Javascript 问题      更新时间:2023-09-26

我有一些JavaScript代码,可以在contenteditable中将哑引号转换为智能引号。

当你在一行的开头添加哑引号时,问题就会出现——它们只会闭合。例如:

”dumb quotes” instead of “dumb quotes”

试用演示:http://jsfiddle.net/7rcF2/

我使用的代码:

function replace(a) {
    a = a.replace(/(^|[-'u2014's('["])'/g, "$1'u2018");       // opening singles
    a = a.replace(/'/g, "'u2019");                            // closing singles & apostrophes
    a = a.replace(/(^|[-'u2014/'[('u2018's])"/g, "$1'u201c"); // opening doubles
    a = a.replace(/"/g, "'u201d");                            // closing doubles
    a = a.replace(/--/g, "'u2014");                           // em-dashes
return a  };

有什么想法吗?谢谢

p。S.我讨厌正则表达式…

试试这个:

var a = '"dumb quotes" instead -- of "dumb quotes", fixed it''s';
 a = a.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(/'b'u2018'b/g,  "'"); // And things like "it's" back to normal.
// Note the missing `;` in these lines. I'm chaining the `.replace()` functions.  

输出:

'“dumb quotes” instead — of “dumb quotes”, fixed it's'

基本上,你在寻找单词边界:'b

这是一个更新的fiddle

如果您想在客户端完成所有工作,可以使用smartquotes.js库将页面上的所有哑引号转换为智能引号。或者,您可以使用库本身的regex。

以下是旧版本代码的实现:

function smartquotesString(str) {
  return str
  .replace(/'''/g, ''u2034')                                                   // triple prime
  .replace(/('W|^)"('S)/g, '$1'u201c$2')                                       // beginning "
  .replace(/('u201c[^"]*)"([^"]*$|[^'u201c"]*'u201c)/g, '$1'u201d$2')          // ending "
  .replace(/([^0-9])"/g,'$1'u201d')                                            // remaining " at end of word
  .replace(/''/g, ''u2033')                                                    // double prime
  .replace(/('W|^)'('S)/g, '$1'u2018$2')                                       // beginning '
  .replace(/([a-z])'([a-z])/ig, '$1'u2019$2')                                  // conjunction's possession
  .replace(/(('u2018[^']*)|[a-z])'([^0-9]|$)/ig, '$1'u2019$3')                 // ending '
  .replace(/('u2018)([0-9]{2}[^'u2019]*)('u2018([^0-9]|$)|$|'u2019[a-z])/ig, ''u2019$2$3')     // abbrev. years like '93
  .replace(/('B|^)'u2018(?=([^'u2019]*'u2019'b)*([^'u2019'u2018]*'W['u2019'u2018]'b|[^'u2019'u2018]*$))/ig, '$1'u2019') // backwards apostrophe
  .replace(/'/g, ''u2032');
};