Предназначена в основном для удовлетворения требований заказчиков к оформлению печатных форм.
Основано на Замена кавычек на «ёлочки» в C# и PHP
Быстродействие на больших объёмах текста не проверял, так как замена кавычек требуется в основном в наименованиях контрагентов или номенклатуры, а они в 99% явно меньше 255 символов. Также не рассматривал упоротые случаи вида Общество с ограниченной ответственностью «Торговый дом «ООО Мокрохрен»».
// Функция заменяет в строке двойные кавычки " на кавычки-елочки «»
// Ported from http://aione.ru/zamena-kavyichek-yolochkami-v-csharp_i_php/
// Coded by Sergey aka Porutchik, 2013, http://forum.aeroion.ru/cat1.html
//
// Параметры
// ИсходныйТекст - Строка - входная строка
//
// Возвращаемое значение:
// Строка - строка с заменёнными кавычками
//
Функция ЗаменитьКавычкиНаЕлочки(Знач ИсходныйТекст) Экспорт
Если Не ЗначениеЗаполнено(ИсходныйТекст) Тогда
Возврат ИсходныйТекст;
КонецЕсли;
ДвойнаяКавычка = """";
КоличествоКавычек = СтрЧислоВхождений(ИсходныйТекст, ДвойнаяКавычка);
// Если количество кавычек меньше двух, ничего не делаем, так как нет смысла закрывать/открывать
Если КоличествоКавычек < 2 Тогда
Возврат ИсходныйТекст;
КонецЕсли;
ЛеваяКавычка = "«";
ПраваяКавычка = "»";
БуквыИЦифры = "0123456789ABCDEFGHIKLMNJOPQRSTUVWXYZ";
БуквыИЦифры = БуквыИЦифры + "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
Результат = "";
ПозицияКавычки = Найти(ИсходныйТекст, ДвойнаяКавычка);
Пока ПозицияКавычки > 0 Цикл
Если ПозицияКавычки = СтрДлина(ИсходныйТекст) Тогда
// Если конец строки заканчивается кавычкой
ИсходныйТекст = Лев(ИсходныйТекст, ПозицияКавычки - 1) + ПраваяКавычка; //
Иначе
// Если впереди кавычки идут буквы и цифры, - ставим открывающую "«"
// Если любые другие символы, - ставим закрывающую "»"
СледующийСимвол = ВРег(Сред(ИсходныйТекст, ПозицияКавычки + 1, 1));
СтрокаЗамены = ?((Найти(БуквыИЦифры, СледующийСимвол) > 0) Или (ПозицияКавычки = 1), ЛеваяКавычка, ПраваяКавычка); //
ИсходныйТекст = Лев(ИсходныйТекст, ПозицияКавычки - 1) + СтрокаЗамены + Сред(ИсходныйТекст, ПозицияКавычки + 1); //
КонецЕсли;
// Если количество кавычек после последней замены осталось меньше двух, ничего не делаем, так как нет смысла закрывать/открывать
КоличествоКавычек = СтрЧислоВхождений(ИсходныйТекст, ДвойнаяКавычка);
Если СтрокаЗамены = ПраваяКавычка И КоличествоКавычек < 2 Тогда
ПозицияКавычки = 0;
Иначе
ПозицияКавычки = Найти(ИсходныйТекст, ДвойнаяКавычка);
КонецЕсли;
КонецЦикла;
Возврат ИсходныйТекст;
КонецФункции // ЗаменитьКавычкиНаЕлочки()
В очередной раз пожалел, что в 1С: Предприятии нет штатных возможностей регулярных выражений для замены текста. Использование COMОбъект VBScript.RegExp к ним не относится.
а упоротые случаи имхо и не сделать нормально из-за неоднозначностей «Торговый дом «ООО Мокрохрен». « ООО Мокрохрен » Торговый дом ».
(1) Не сделать, потому и не пытался. Обсуждениеhttp://forum.dklab.ru/viewtopic.php?t=10653
MS Word, например, обособленную кавычку или после открывающей скобки делает открывающей ёлочкой. Думаю имеет смысл задействовать такую же логику и в этой функции. Это в некотором роде обратная логика: всё, что не закрываем, — открываем.
Пример: [обособленная: » или после откр. скобки: (» — надо «открывающие»].
А заодно хорошо бы предоставить пользователю экранировать кавычку: » → «.
Хотя, если шрифт печатной формы не моноширный, то можно две одинарных ставить. )
Нет, уважаемые кроты, при анализе не лучше ли вначале посчитать количество кавычек и обычных и ёлочек?
Спасибо, очень выручили!
(2)
А вы уверены что это будет прокатывать в 1ске ?
//**
// функция замены обычных кавычек » на русские елочки
function rus_quote($s) {
$s = preg_replace (www.php.net/preg_replace)(
array (www.php.net/array)(
«/(#k8SjZc9Dxk|s+|(|<|{[|)»/ms»,
«/»(s+|.|,|!|?|)|>|}|]|||$)/ms»,
),
array (www.php.net/array)(
«\1«»,
«»\1»,
),
$s
);
return $s;
}
Большое спасибо!
// СтрокаСКавычками = «Alena» «Egorova»
СтрокаБезКавычки = СтрЗаменить(СтрокаСКавычками,»»»»,»»);
Сообщить(СтрокаБезКавычки); // Alena Egorova
Пользуемся ALT и клавиатурой NumLock
ALT+0171 — «
ALT+0187 — »