Преобразование "прямые кавычки" на "кавычки"

у меня есть приложение, которое использует движок правил на основе Javascript. Мне нужен способ конвертировать регулярные прямые кавычки в фигурные (или умные) кавычки. Было бы легко просто сделать string.replace на ["], только это будет вставлять только один случай фигурной цитаты.

лучший способ, который я мог придумать, - это заменить первое вхождение цитаты левой фигурной цитатой, а все остальные-левой, а остальные-правой.

есть ли способ, чтобы выполнить это использование Javascript?

8 ответов


вы можете заменить все, что предшествует символу слова с левой кавычкой, и все, что следует за символом слова с правой кавычкой.

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

(я оставил исходное решение выше, если это полезно для кого-то, кто использует язык, который поддерживает look-behind)


вы можете посмотреть, что Pandoc не-видимо с --smart опция, она обрабатывает кавычки правильно во всех случаях (включая, например, ’tis и ’twere).

недавно я написал JavaScript typography prettification engine, который, среди прочего, цитирует замену; я закончил, используя в основном алгоритм, предложенный Ренесис, но в настоящее время неудачный тест ждет более умного решения.

Если вы заинтересованы в cribbing мой код (и / или отправки патча на основе работы, которую вы сделали), проверьте его: jsPrettify. jsprettify.prettifyStr делает то, что вы ищете. Если вы не хотите иметь дело с зависимостью закрытия, есть старая версия который работает сам по себе-он даже работает на носороге.


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

следующее просто изменяет каждую цитату, чередуя (этот конкретный пример, однако, опустил бы осиротевшие кавычки).

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

отлично работает, пока текст, который вы текстурируете, еще не испорчен неправильным использованием двойной кавычки. В английском языке кавычки никогда не вложены.


спасибо. Чтобы сделать это с помощью PHP:http://pastebin.com/CEK0NN43

противоположное с JavaScript:http://www.kevinkorb.com/post/37

но проблема на страницах, которые преобразуют из вертикальных кавычек в фигурные, заключается в том, что если преобразование выполняется в компьютерный код, он обычно не работает, поэтому вам нужно повторно преобразовать все кавычки обратно в вертикальные.


Я не думаю, что что-то подобное В общем легко вообще, потому что вам придется точно интерпретировать, что означает каждый символ двойной кавычки в вашем контенте. Тем не менее, я бы собрал все текстовые узлы, которые меня интересовали, а затем прошел и отслеживал "вкл/выкл" (или "нечетный/четный"; что угодно) характер каждого экземпляра двойной цитаты. Затем вы можете узнать, какой заменяющий объект использовать.


Я не нашел логики, которую хотел здесь, поэтому вот что я закончил.

value = value.replace(/(^|\s)(")/g, "“"); // 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.


публикация для потомков.

как предложил @Steven Dee, я пошел в Pandoc.

Я пытаюсь использовать зрелый и испытанный инструмент, когда могу, а не выпекать собственное регулярное выражение. Построенные вручную regex могут быть чрезмерно жадными или недостаточно жадными, и они могут не быть чувствительны к границам слов и запятым и т. д. Pandoc составляет большинство этого и многое другое.

из командной строки (параметр --smart включает smart цитаты):

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

..и я знаю, что сценарий командной строки может или не может соответствовать требованию OP использование Javascript. (по теме: Как выполнить команду оболочки в Javascript)