Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> заменить апострофа на кавычки(елочка) 
:(
    Опции темы
lumentek
Дата 14.7.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 19.11.2009

Репутация: нет
Всего: нет



В общем мне нужно перед добавлением текста правильно  типографировать, а именно заменить апострофы на кавычки (елочку) учитывая двойную вложенность? Тоесть, возможно,  что в тексте будет 2 пары кавычек, а не одна, причем вторая пара внутри первой
PM MAIL   Вверх
NLspieler
Дата 15.7.2010, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Пример в студию
PM MAIL   Вверх
lumentek
Дата 15.7.2010, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 19.11.2009

Репутация: нет
Всего: нет



В этом примере "есть строка, в которой есть "еще" подстрока" деменстрирующая двойную вложенность


Вот мне хотя бы с двойной вложеностью справится.

Например, типограф лебедева решает эти задачи, но его не внедришь на сайт
PM MAIL   Вверх
NLspieler
Дата 15.7.2010, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Сделать можно регулярками

Остается вопрос, как определить, идет ли речь о двойной вложенности, или же речь идет о двух одинарных заключениях в кавычки?

Это сообщение отредактировал(а) NLspieler - 15.7.2010, 03:24
PM MAIL   Вверх
lumentek
Дата 15.7.2010, 04:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 19.11.2009

Репутация: нет
Всего: нет



В этом  тоже суть проблемы. Не известно какую строку передаст пользователь
Тоесть может быть такие вариант

1. Строка "с двойной "вложенностью""
2. Просто "строка" с "кавычками"
PM MAIL   Вверх
skyboy
Дата 15.7.2010, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(NLspieler @  15.7.2010,  02:19 Найти цитируемый пост)
Остается вопрос, как определить

если строка сформирована правильно, то открывающая кавычка следует за пробелом и примыкает к буквенному символу, а закрывающая, соответственно, стоит перед пробелом/символом пунктуации и примыкает к буквенному символу.
В таком случае, отличить одну указанную ситуацию от другой не составит труда.
PM MAIL   Вверх
ksnk
Дата 15.7.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(lumentek @  15.7.2010,  03:02 Найти цитируемый пост)
Например, типограф лебедева решает эти задачи, но его не внедришь на сайт 

как это? а это что?

Добавлено через 8 минут и 49 секунд
если послушать skyboy, то может получится что-то такое
Код

$s = 'В этом примере "есть строка, в которой есть "еще" подстрока" деменстрирующая двойную вложенность';

function repl2level($m){
    return '«'.$m[2].'„'.$m[3].'&ldquo'.$m[4].'»';
}

echo preg_replace_callback('/\s(["\'])(\S[^\\1]*\s)\\1(\S[^\\1]*\S)\\1(\s[^\\1]*\S)\\1/ms','repl2level',$s);

так что весь типограф может быть набором таких регулярок...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 15.7.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



ksnk, не надо сверхсложных регулярок(это ещё нет регулярки на вариант "строки внутри которой "несколько" вложенных "пар" кавычек")
достаточно сделать стек: preg_replace_callback + функция со статической-переменной счетчиком.
если открывающая кавычка - увеличивать счетчик.
если закрывающая кавычка - уменьшать счетчик.
и в соответствие со значение счетчика возвращать для замены ту или иную замысловатую кавычку.
и в этой же функции можно просто игнорировать кавычки с пробелами по бокам( " ), как некорректную пунктуацию.
правда, проблема: когда счетчик принудительно сбрасывать(чтоб в одном месте лишняя кавычка не навредила всему тексту)? по правилам языка, надо бы искать конец предложения, но конец предложения уже не найти при помощи регулярки. хотя, может, это и не критично.
PM MAIL   Вверх
ksnk
Дата 15.7.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



skyboy, Особенные глюки могут возниать, есть юзер не там пробел поставил ;) или не тот апостроф...
Так что лучше пользоваться тёминым типографом и все глюки валить на него, а он всех пошлет куда обычно  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 15.7.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Код

function replaceQuotes($arrayToReplace) {
    $openQuotes = array('«', '"');
    $closeQuotes = array('»', '"');
    static $counter = 0;
    if (preg_match('#\s"\S#u', $arrayToReplace[0])) {
        $result = substr($arrayToReplace[0], 0, 1) . $openQuotes[$counter] . substr($arrayToReplace[0], -1);
        $counter++;
    } else if (preg_match('#\S"\s#u', $arrayToReplace[0])) {
        $counter--;
        $result = substr($arrayToReplace[0], 0, 1) . $closeQuotes[$counter] . substr($arrayToReplace[0], -1);
    } else {
        $result = $arrayToReplace[0];
    }
    return $result;
}

$str='simple text "but" with some "iheritance of "breaces" -"  ';
$str = preg_replace_callback('#.".#u', 'replaceQuotes', $str);
echo $str;

случаи, которые не обрабатываются:
две подряд идущие кавычки(закрывающие). кстати, согласно правилам закрытия, несколько(две, как я понимаю) подряд идущие закрывающие кавычки не пишутся - только одна. т.е. с точки зрения правил грамматики правильно писать вот так:
Цитата

Он сказал мне: "Подай мне "глагол". И я подал.
 если для двух подряд идущих можно использовать утверждения в регулярках, то как быть в случае легитимного "слипания" кавычек - не могу сказать.
кавычка в самом конце строки или в самом начале. надо просто расширить регулярки.
PM MAIL   Вверх
lumentek
Дата 15.7.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 19.11.2009

Репутация: нет
Всего: нет



Цитата(skyboy @ 15.7.2010,  12:17)

случаи, которые не обрабатываются:
две подряд идущие кавычки(закрывающие). кстати, согласно правилам закрытия, несколько(две, как я понимаю) подряд идущие закрывающие кавычки не пишутся - только одна.

Да дейсвительно. Либо как вы сказали, либо для второй вложенной пары используются кавычки второго уровня (лапки). 

Цитата

Привер : «„Цыганы мои не продаются вовсе“, — сетовал Пушкин»


http://ru.wikipedia.org/wiki/Кавычки

Это сообщение отредактировал(а) lumentek - 15.7.2010, 13:01
PM MAIL   Вверх
lumentek
Дата 15.7.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 19.11.2009

Репутация: нет
Всего: нет



skyboy, как реализовать в вашем коде так,  чтобы вторая пара вложенных кавычек заменялась лапками, а первая оствалась елочкой?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.