Personal penis extender™. Extending penis since 1998. эбаут  •  скачать  •  карта сайта  •  почта    
SPECTATOR: OUTDATED
Home / технологии / php / Кавычки strike back

Кавычки strike back

  // 9 сентября 2002 года

Постановка задачи: как известно, крутые дизайнеры и контент-девелуперы расставляют только правильные кавычки, которые в русском языке должны выглядить так:

Вася сказал: «Я живу в отеле Калифорния“».

Для этого в html нужно писать совсем хитрые комбинации:

Вася сказал: «Я живу в отеле „Калифорния“&#187

Если вам лениво писать все это от руки — можно писать простые кавычки — ’’ (которые на самом деле являются знаком дюйма), а потом пропустить текст через скрипт и он сам расставит все, как надо. Вдоволь намаявшись со скриптом годичной давности, я решил создать что-то универсальное, которое понимает html, даже «красиво» написанный с пробелами, типа: <img src = "сслыка" width = "23" alt= " а тут еще и альт идет" >. Кроме того, не надо забывать про вложенные кавычки и про то, что внутри текста с кавычками может идти любой html — тоже с кавычками, например —
Вася сказал: «Я живу в отеле „Калифорния“». Ох уж этот Вася.

Внимание! Самую свежую версию кавычкера можно скачать здесь.


function kavych ($contents)
{

// Kavychki (c) Spectator.ru

// замена кавычек в html-тэгах на символ "¬"
$contents=preg_replace ( "/<([^>]*)>/es", "'<'.str_replace ('"', '¬','1').'>'", $contents);

// замена кавычек внутри <code> на символ "¬"
$contents=preg_replace ( "/<code>(.*?)</code>/es", "'<code>'.str_replace ('"', '¬','1').'</code>'", $contents);

// расстановка кавычек: кавычка, перед которой идет ( или > или пробел = начало слова,
// кавычка, после которой не идет пробел = это конец слова.

$contents=preg_replace ( "/([>(s])(")([^"]*)([^s"(])(")/", "1«34»", $contents);

// что, остались в тексте нераставленные кавычки? значит есть вложенные!
if (stristr ($contents, '"')):

// расставляем оставшиеся кавычки (еще раз).
$contents=preg_replace ( "/([>(s])(")([^"]*)([^s"(])(")/", "1«34»", $contents);

// расставляем вложенные кавычки
// видим: комбинация из идущих двух подряд открывающихся кавычек без закрывающей
// значит, вторая кавычка - вложенная. меняем ее и идущую после нее, на вложенную (132 и 147)
while (preg_match ("/(«)([^»]*)(«)/", $contents)) $contents=preg_replace ( "/(«)([^»]*)(«)([^»]*)(»)/", "12&#132;4&#147;", $contents);

// конец вложенным кавычкам
endif;

// расстанавливаем правильные коды и тире
$contents = str_replace ('«','&laquo;', $contents);
$contents = str_replace ('»','&raquo;', $contents);
$contents = str_replace (' - ','&nbsp;&#151; ', $contents);

// меняем "¬" обратно на кавычки
$contents = str_replace ('¬','"', $contents);

// еще несколько строк кода, которые лично у меня делают всякие полезные вещи

return $contents;

}

Вы можете закопипастить (copy-paste) этот кусочек куда угодно. Там, где вам надо, просто вызовите эту функцию: $text=kavych ($text); и скажите мне «спасибо». Предложения по улучшению принимаются с благодарностью. (Шлите мылом).

Для тех, кто в танке: кавычки в вышеприведенном коде не «сами расставились», они так и должны быть. Повторяю: Вы можете закопипастить (copy-paste) этот кусочек куда угодно. И он будет работать.

PS.

Known bug у этого скрипта был только один: скрипт портит програмный код (например, PHP), приведенный на странице в качестве примера:

<? echo («кавычки сосут»); ?>

Есть и путь решения этого бага: использовать тэг CODE для выделения кода на странице: идеологически выдержанно, политически верно и удобно одновременно — и сделать так, чтобы скрипт ничего не менял внутри тэгов <code></code>:

<? echo ("кавычки не сосут"); ?>

(смотрите вторую строчку в скрипте)

Update

Комментарий от Александра Крылова.

Есть еще &prime; и &Prime; — как раз для того, чтобы с кавычками не путать.

prime = "&#8242;" -- prime = minutes = feet (для обозначения минут и футов),
Prime = "&#8243;" -- double prime = seconds = inches (для обозначения секунд и дюймов).

Вот вам выход — когда нужно обозначить именно дюймы, например: «Монитор 19″»

Update-2. То, что у меня стоит сейчас, как обычно, очень сильно отличается от того, что написано выше. Но общую идею вы поняли?..

 

поиск:



 ^  Copyright © 1998-2008 by Дмитрий Смирнов. Перепечатки возможны только с указанием ссылки.