он же ж вроде какбы одинаковый будет что для UNICODE что для ASCII зы: зайди в аську. зызы: ответьте кто-нить на вопрос http://www.php.ru/forum/viewtopic.php?p=163262#163262 (по поводу интерфейса и абстрактного класса)
Функционал фильтра - отличный. Говенные названия констант и непонятно, зачем там $params = null 1. strip = резать. потому для htmlspecialchars не подходит. как и add для htmlspecialchars_decode 2. кстати, можно еще добавить типа strip_slashes_recursive. Это бывает нужно, чтобы полностью отключить magic_quotes 3. Сейчас в функции filter та же проблема с названиями констант, что и во всех встроенных функциях пыха. Ты стараешься сделать: *. Ближе к оригинальным названиям *. Не упустить ни одной детали, дать название как можно более точное *. Опасаешься, что про тебя подумают программисты, если ты дашь короткие не заумные названия Известно, что программисты любят длинные заумные названия (как и физики-ядерщики )). Так они кажутся умнее: "Три основных принципа Объектно-ориентированного программирования - Инкапсуляция, Наследование, Полиморфизм". Я до сих пор лезу в Википедию, чтобы посмотреть, как там правильно пишется "Ин-ка-псу-ля-ция". И я до сих пор лезу на php.net, чтобы посмотреть разницу между stripcslashes и stripslashes. Таким образом, вместо того, чтобы сделать этот ньюанс красивым (в этом ведь смысл класса?), ты сделал его еще хуже, извини: Код (Text): Str::filter($string, Str::SLASHES_STRIP); stripslashes($string); Я за названиями stripslashes, htmlspecialchars лазил в ман, а тут... Потому мое мнение: я бы сделал такой интерфейс: public static function filter($string, $mode, $decode = false); И что-то типа таких констант $mode: Str::HTML, Str::SLASH. А для addcslashes, насколько я знаю, нужны обязательные дополнительные символы и она отличается от addslashes только этим? * * * * * Метод hash - да, нах. array_get_range, если нужен - в приватный метод, а не в глобальное пространство Есть предложение полностью уйти от привязки к именам, как в пыхе, а использовать их только, если это действительно стоящее название. И вариант с методом filter только доказывает, что это нужно.
TheShock фильтр ессно будет работать с массивами. $params = null - наверно в некоторых случаях нужно будет засылать дополнительные параметры (типа не преобразовывать " в " array_get_range - потом будет вынесен в обертку для массивов, гыгы.
тогда, чтобы не загромождать парамтреми можно сделать через побитовое сравнение: PHP: <? // Decode Str::filter($string, Str::HTML | 1, $params); Str::filter($string, Str::HTML | Str::DECODE, $params); // Encode Str::filter($string, Str::HTML | 0, $params); Str::filter($string, Str::HTML | STR::ENCODE, $params); Str::filter($string, Str::HTML, $params); // Add Str::filter($string, Str::SLASHES | 1, $params); Str::filter($string, Str::SLASHES | Str::ADD, $params); // Strip Str::filter($string, Str::SLASHES | 0, $params); Str::filter($string, Str::SLASHES | STR::STRIP, $params); Str::filter($string, Str::SLASHES, $params); Главное - надо будет следить, чтобы константы в двоичном представлении обязательно на "нуль" заканчивались. Это все парные числа. Естественно,
Кстати, есть еще quotemeta и htmlentities. Но у меня вопрос: Сколько вы знаете примеров использования quotemeta, htmlentities и addcslashes, которые были бы не те самые цели, что осуществляются addslashes и htmlspecialchars? Хотя, класс рассчитан на расширение функционала, может, тут лучше им пожертвовать, как думаете?
так-с, я создал другую ветвь http://code.google.com/p/strclass/sourc ... 43911f68bb и в нее закоммитил изменения по поводу changeCase. А именно: логика сделана как здесь http://www.php.ru/forum/viewtopic.php?p=162590#162590 . Правда еще не все режимы работают. Но имхо: гавно выходит. Не знаю почему, но мне старая логика нравится больше. Кода получается много, польза сомнительна. Проще наверно добавить какой-нить invertCase зы: расчехлите как работать с тегами и бранчами в Mercurial.
Не вижу в коде изменений. В данном случае старая логика действительно лучше. В той теме я давал просто пример.
TheShock там сверху есть переключение между бранчами. Cм скрин подождем, что скажут другие товарищи: откатить на старый changeCase и добавить invertCase или допилить измененный.
В "Default" вообще старый вариант: Код (Text): case self::UP: case self::DOWN: case self::FIRST_UP: case self::TITLE: В "another..." Код (Text): public static function changeCase($string, $what = self::ALL, $mode = self::UP) { switch ($mode) { case self::UP:
ну да. PHP: <?php changeCase('строка из нескольких слов') // все в верхний регистр changeCase('строка из нескольких слов', Str::TITLE, STR::DOWN_FORCED) // первые буквы каждого слова в нижний, остальные в верхний - в старой версии так нельзя сделать. changeCase('строка из нескольких слов', Str::TITLE, STR::UP) // первые буквы каждого слова в верхний, остальные не трогать.
Koc, понял, извини, что-то я увидел Str::ALL | Str::FIRST | Str::TITLE и подумал, ты про побитовое сравнение ) Все же я считаю, что этот вариант лучше. Он логичнее, более расширяем и удобней Логичнее - потому что логично объясняется: "Сначала мы выбираем символы с которыми работаем, потом - что с ними делаем" Более расширяем - потому что если ты захочешь добавить изменение регистра, скажем, первого слова - ты добавляешь одну константу Str::FIRST_WORD, если захочешь изменить регистр последних букв каждого слова - добавляешь константу Str::LAST_LETTERS. Удобней, имхо, выплывает из первого пункта. Для меня логичнее значит удобнее.
флоппик хе-хе, спасибо. Небольшое обновление. Пока еще не все комбинации работают в changeCase. Кто хочет помочь - смотрите //TODO - эти куски не работают. Знаете как сделать их рабочими - вэлком с кодом ко мне. К примеру я не шарю как отделять первый символ слова от остальных. Также я добавил 2 новых режима: INVERT и RANDOM к примеру Str::ChangeCase($str, Str::ALL, Str::INVERT) // инвертирует регистр всей строки Str::ChangeCase($str, Str::ALL, Str::RANDOM) // по идее должна сделать "имбецильную" строку. Как здесь
Кстати, насчет decode64: PHP: <? Str::Base64($string, DECODE); Str::Base64($string, ENCODE); ?> Можно примерно так. Ну это только предложение
TheShock да читал я, читал. Пока не знаю ф-ций обратимого шифрования нормальных. Если знаешь - кидай ссылки и как их обозвать. Хотя в чем преимущество самопимных перед basr64?
А тут есть японские символы PHP: <?php header('Content-type: text/plain; charset="utf-8"'); $string = "PHP - мова, яка може !бути! вбудована безпосередньо в html-код сторінок."; $title = preg_replace_callback("/([\p{L}\p{Nd}]+)/u", 'printPart', $string); function printPart ($m) { /* тут $m[0] - это каждое отдельное слово строки. * Работаешь с ним и возвращаешь новое, на которое оно и заменится. * Например: */ return "_" . $m[0] . "_"; } // _PHP_ - _мова_, _яка_ _може_ !_бути_! _вбудована_ _безпосередньо_ _в_ _html_-_код_ _сторінок_. echo $title; ?>
Koc, я вообще говорю про предложение. Самописные. Ну например , двойной квадрат и xor-шифрование. Преимущества перед base принципиального нету. Только разнообразие Хотя я и бейзом то никогда не пользовался.
"rand(0, 1) == 1 ?" можно заменить на "rand(0, 1)" added: PHP: <?php // и вообще я бы поменял $char = self::caseInvert($char); rand(0, 1) == 1 ? $char = self::caseInvert($char) : null; // не понял, зачем дважды символ инвертируется $сhar = rand(0, 1) ? self::caseInvert($char) : $char; // А во всех функциях заменить for ($i = 0; $i < mb_strlen($string); $i++) // Потому что в предыдущем варианте при каждом проходе цикла происходит подсчет длины строки, которая не меняется for ($i = 0, $c = mb_strlen($string); $i < $c; $i++)
TheShock Да то ацкей копипаст из комментов php.net/manual . Я почему-то не догадался как инвертировать регситр. Думал даже что только через str_pad и регулярки это возможно. PHP: <? for ($i = 0; $i < strlen($string); $i++) { // плохо // а так лучше $n = strlen($string); for ($i = 0; $i < $n; $i++) {