将“直引号”转换为“卷曲行情”

时间:2010-02-04 20:09:58

标签: javascript regex quotes smart-quotes

我有一个使用基于Javascript的规则引擎的应用程序。我需要一种方法将常规直引号转换为卷曲(或智能)引号。为string.replace做一个["]很容易,只会插入一个卷曲引用的情况。

我能想到的最好的方法是用左边的卷曲引号替换第一次出现的引用,用左边的代码替换每个其他的引用,其余的右边卷曲。

有没有办法使用Javascript完成此操作?

7 个答案:

答案 0 :(得分:14)

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

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

(我已经离开了上面的原始解决方案,以防这对使用支持后视的语言的人有帮助)

答案 1 :(得分:5)

您可能希望查看Pandoc显然使用--smart选项的内容,它会在所有情况下正确处理引号(包括例如'tis和'twere)。

我最近写了一个Javascript排版预处理引擎,除了其他功能之外,它还有报价替换;我基本上使用了Renesis建议的算法,但目前还有一个失败的测试等待更智能的解决方案。

如果您有兴趣破坏我的代码(和/或根据您已完成的工作提交补丁),请查看:jsPrettifyjsprettify.prettifyStr做你想要的。如果你不想处理Closure依赖关系,那么就会有一个older version自己运行 - 它甚至可以在Rhino中运行。

答案 2 :(得分:3)

'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
    return "“" + m1 + "”";
});

答案 3 :(得分:2)

以下内容只是通过交替更改每个引用(但这个具体示例会遗漏孤立的引号)。

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

完美无缺,只要你的纹理化文本没有被错误地使用双引号搞砸了。在英语中,引号永远不会嵌套。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我没有找到我想要的逻辑,所以这就是我最终的目标。

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

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

答案 6 :(得分:0)

为后代发帖。

根据@Steven Dee的建议,我去了Pandoc

我尝试使用成熟且经过测试的工具,而不是烘焙我自己的正则表达式。手工制作的正则表达式可能过于贪婪,或者不够贪婪,并且它们可能对字边界和逗号等不敏感.Pandoc占大多数这一点甚至更多。

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

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

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