22

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

我能想到的最好的方法是用左花引号替换第一次出现的引号,然后用左花引号替换所有其他引号,其余的用右花引号替换。

有没有办法使用 Javascript 来实现这一点?

4

7 回答 7

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

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

于 2010-02-04T20:13:59.910 回答
5

您可能想看看Pandoc做了什么——显然使用该--smart选项,它在所有情况下都能正确处理引号(包括例如 'tis 和 'twere)。

我最近编写了一个 Javascript 排版美化引擎,除其他外,它还可以替换引号;我基本上使用了Renesis建议的算法,但目前有一个失败的测试等待更智能的解决方案。

如果您有兴趣抄袭我的代码(和/或根据您所做的工作提交补丁),请查看:jsPrettifyjsprettify.prettifyStr做你正在寻找的东西。如果你不想处理 Closure 依赖,有一个旧版本可以自己运行——它甚至可以在 Rhino 中运行。

于 2010-03-25T04:29:03.907 回答
4
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
    return "“" + m1 + "”";
});
于 2010-02-04T20:12:46.777 回答
3

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

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

只要您正在纹理化的文本尚未因不正确使用双引号而搞砸,就可以完美运行。在英语中,引号从不嵌套。

于 2010-11-29T04:43:33.777 回答
0

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

于 2010-02-04T20:15:32.340 回答
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

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

于 2014-12-12T18:03:55.963 回答
0

为后人发帖。

正如@Steven Dee 所建议的,我去了Pandoc

与烘焙自己的正则表达式相比,我尽可能尝试使用成熟且经过测试的工具。手工构建的正则表达式可能过于贪婪,或者不够贪婪,并且它们可能对单词边界和逗号等不敏感。Pandoc 占了大部分以及更多。

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

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

..而且我知道命令行脚本可能符合也可能不符合 OP使用 Javascript的要求。(相关:如何在 Javascript 中执行 shell 命令

于 2016-02-27T14:36:20.073 回答