代码之家  ›  专栏  ›  技术社区  ›  BlueVoid

将_3直引号_3转换为__弯引号_157;

  •  19
  • BlueVoid  · 技术社区  · 16 年前

    我有一个使用基于javascript的规则引擎的应用程序。我需要一种方法将普通的直引号转换成卷曲(或智能)引号。做一个简单的 string.replace 对于 ["] ,仅此操作将只插入一个大括号。

    我能想到的最好的方法是用左花引号替换第一次出现的引号,后面的每一个都用左花引号替换,其余的右花引号替换。

    有没有一种方法可以使用JavaScript来完成这个任务?

    7 回复  |  直到 10 年前
        1
  •  14
  •   Nicole    16 年前

    您可以用左引号替换单词字符前面的所有字符,用右引号替换单词字符后面的所有字符。

    str = str.replace(/"(?=\w|$)/g, "“");
    str = str.replace(/(?<=\w|^)"/g, "&#8221;"); // IF the language supports look-
                                                 // behind. Otherwise, see below.
    

    正如下面的评论所指出的,这不考虑标点符号,但很容易:

    /(?<=[\w,.?!\)]|^)"/g
    

    [ 编辑 :]对于不支持“向后看”的语言(如javascript),只要先替换所有面向前面的语言,就有两个选项:

    str = str.replace(/"/g, "&#8221;"); // Replace the rest with right curly quotes
    // or...
    str = str.replace(/\b"/g, "&#8221;"); // Replace any quotes after a word
                                          // boundary with right curly quotes
    

    (我保留了上面的原始解决方案,以防这对使用支持“向后看”的语言的人有帮助)

        2
  •  5
  •   Community Mohan Dere    9 年前

    你可能想看看 Pandoc _ --smart 选项,它在所有情况下(包括_tis和_twere)正确处理报价。

    我最近写了一个javascript字体预处理引擎,除了其他功能外,它还可以替换引号;最后我基本上使用了 Renesis 但目前有一个失败的测试等待更智能的解决方案。

    如果您有兴趣抄写我的代码(和/或根据您所做的工作提交补丁),请查看: jsPrettify . jsprettify.prettifyStr 做你想做的。如果您不想处理闭包依赖关系,那么 older version 它自己运作,甚至在犀牛身上工作。

        3
  •  3
  •   Luca Matteis    16 年前
    'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
        return "“" + m1 + "”";
    });
    
        4
  •  2
  •   tchrist    15 年前

    以下只是通过交替的方式更改每个引号(然而,这个特定的示例将省略孤立的引号)。

    str.replace(/\"([^\"]*)\"/gi,"&#8220;$1&#8221;");
    

    完美的工作,只要你的文本纹理还没有被错误使用双引号搞砸。在英语中,引号从不嵌套。

        5
  •  0
  •   Pointy    16 年前

    我不这么认为 一般来说 这很容易,因为你必须准确地解释你的内容中每个双引号字符的含义。也就是说,我要做的是收集我感兴趣的所有文本节点,然后遍历并跟踪每个双引号实例的“开/关”(或“奇数/偶数”)性质。然后您可以知道要使用哪个替换实体。

        6
  •  0
  •   David Lee    11 年前

    我在这里找不到我想要的逻辑,所以这就是我最终要做的。

    value = value.replace(/(^|\s)(")/g, "$1“"); // replace quotes that start a line or follow spaces
    value = value.replace(/"/g, "”"); // replace rest of quotes with the back smart quote
    

    我有一个小的文本区域,我需要用卷曲(智能)引号替换直引号。我只是在keyup上执行这个逻辑。我试着让它表现得像微软的Word。

        7
  •  0
  •   Community Mohan Dere    9 年前

    为后代过账。

    根据@steven dee的建议,我去了 Pandoc .

    我尽量使用一个成熟的和测试过的工具,无论什么时候我都可以与烘焙自己的regex相比。手工构建的regex可能过于贪婪,或者不够贪婪,它们可能对单词边界和逗号等不敏感。pandoc解释了这一点和更多。

    从命令行(--smart参数打开smart引号):

    pandoc --smart --standalone -o output.html input.html

    …而且我知道命令行脚本可能或可能不符合OP的要求 使用javascript . (相关: How to execute shell command in Javascript )