Кавычки strike back
Постановка задачи: , крутые дизайнеры и контент-девелуперы расставляют только правильные кавычки, которые в русском языке должны выглядить так:Вася сказал: «Я живу в отеле Калифорния».
Для этого в html нужно писать совсем хитрые комбинации:
Вася сказал: «Я живу в отеле „Калифорния“»
Если вам лениво писать все это от руки — можно писать простые кавычки — ’’ (которые на самом деле являются знаком дюйма), а потом пропустить текст через скрипт и он сам расставит все, как надо. Вдоволь намаявшись со скриптом годичной давности, я решил создать что-то универсальное, которое понимает html, даже «красиво» написанный с пробелами, типа: <img src = "сслыка" width = "23" alt= " а тут еще и альт идет" >. Кроме того, не надо забывать про вложенные кавычки и про то, что внутри текста с кавычками может идти любой html — тоже с кавычками, например —
Вася сказал: «Я живу в отеле „“». Ох уж этот Вася.
Внимание! Самую свежую версию кавычкера можно скачать .
function kavych ($contents) // Kavychki (c) Spectator.ru
// замена кавычек в html-тэгах на символ "¬" // замена кавычек внутри <code> на символ "¬" // расстановка кавычек: кавычка, перед которой идет ( или > или пробел = начало слова, $contents=preg_replace ( "/([>(s])(")([^"]*)([^s"(])(")/", "1«34»", $contents);
// что, остались в тексте нераставленные кавычки? значит есть вложенные! // расставляем оставшиеся кавычки (еще раз). // расставляем вложенные кавычки // конец вложенным кавычкам // расстанавливаем правильные коды и тире // меняем "¬" обратно на кавычки // еще несколько строк кода, которые лично у меня делают всякие полезные вещи
return $contents;
}
{
$contents=preg_replace ( "/<([^>]*)>/es", "'<'.str_replace ('"', '¬','1').'>'", $contents);
$contents=preg_replace ( "/<code>(.*?)</code>/es", "'<code>'.str_replace ('"', '¬','1').'</code>'", $contents);
// кавычка, после которой не идет пробел = это конец слова.
if (stristr ($contents, '"')):
$contents=preg_replace ( "/([>(s])(")([^"]*)([^s"(])(")/", "1«34»", $contents);
// видим: комбинация из идущих двух подряд открывающихся кавычек без закрывающей
// значит, вторая кавычка - вложенная. меняем ее и идущую после нее, на вложенную (132 и 147)
while (preg_match ("/(«)([^»]*)(«)/", $contents)) $contents=preg_replace ( "/(«)([^»]*)(«)([^»]*)(»)/", "12„4“", $contents);
endif;
$contents = str_replace ('«','«', $contents);
$contents = str_replace ('»','»', $contents);
$contents = str_replace (' - ',' — ', $contents);
$contents = str_replace ('¬','"', $contents);
Вы можете закопипастить (copy-paste) этот кусочек куда угодно. Там, где вам надо, просто вызовите эту функцию: $text=kavych ($text); и скажите мне «спасибо». Предложения по улучшению принимаются с благодарностью. (Шлите мылом).
Для тех, кто в танке: кавычки в вышеприведенном коде не «сами расставились», они так и должны быть. Повторяю: Вы можете закопипастить (copy-paste) этот кусочек куда угодно. И он будет работать.
PS.
Known bug у этого скрипта был только один: скрипт портит програмный код (например, PHP), приведенный на странице в качестве примера:
<? echo («кавычки сосут»); ?>
Есть и путь решения этого бага: использовать для выделения кода на странице: идеологически выдержанно, политически верно и удобно одновременно — и сделать так, чтобы скрипт ничего не менял внутри тэгов <code></code>:
<? echo ("кавычки не сосут"); ?>
(смотрите вторую строчку в скрипте)
Update
Комментарий от Александра Крылова.
Есть еще ′ и ″ — как раз для того, чтобы с кавычками не путать.
prime = "′" -- prime = minutes = feet (для обозначения минут и футов),
Prime = "″" -- double prime = seconds = inches (для обозначения секунд и дюймов).
Вот вам выход — когда нужно обозначить именно дюймы, например: «Монитор 19″»
Update-2. То, что у меня стоит сейчас, как обычно, очень сильно отличается от того, что написано выше. Но общую идею вы поняли?..