За последние 24 часа нас посетили 18236 программистов и 1637 роботов. Сейчас ищут 1674 программиста ...

удобная работа со строками [решение, рассуждение]

Тема в разделе "Решения, алгоритмы", создана пользователем Koc, 6 июн 2009.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    он же ж вроде какбы одинаковый будет что для UNICODE что для ASCII

    зы: зайди в аську.

    зызы: ответьте кто-нить на вопрос http://www.php.ru/forum/viewtopic.php?p=163262#163262 (по поводу интерфейса и абстрактного класса)
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Функционал фильтра - отличный. Говенные названия констант и непонятно, зачем там $params = null
    1. strip = резать. потому для htmlspecialchars не подходит. как и add для htmlspecialchars_decode
    2. кстати, можно еще добавить типа strip_slashes_recursive. Это бывает нужно, чтобы полностью отключить magic_quotes
    3. Сейчас в функции filter та же проблема с названиями констант, что и во всех встроенных функциях пыха. Ты стараешься сделать:
    *. Ближе к оригинальным названиям
    *. Не упустить ни одной детали, дать название как можно более точное
    *. Опасаешься, что про тебя подумают программисты, если ты дашь короткие не заумные названия
    Известно, что программисты любят длинные заумные названия (как и физики-ядерщики :))). Так они кажутся умнее: "Три основных принципа Объектно-ориентированного программирования - Инкапсуляция, Наследование, Полиморфизм". Я до сих пор лезу в Википедию, чтобы посмотреть, как там правильно пишется "Ин-ка-псу-ля-ция". И я до сих пор лезу на php.net, чтобы посмотреть разницу между stripcslashes и stripslashes.

    Таким образом, вместо того, чтобы сделать этот ньюанс красивым (в этом ведь смысл класса?), ты сделал его еще хуже, извини:
    Код (Text):
    1. Str::filter($string, Str::SLASHES_STRIP);
    2. stripslashes($string);
    Я за названиями stripslashes, htmlspecialchars лазил в ман, а тут...

    Потому мое мнение:

    я бы сделал такой интерфейс: public static function filter($string, $mode, $decode = false);
    И что-то типа таких констант $mode: Str::HTML, Str::SLASH.

    А для addcslashes, насколько я знаю, нужны обязательные дополнительные символы и она отличается от addslashes только этим?

    * * * * *

    Метод hash - да, нах.

    array_get_range, если нужен - в приватный метод, а не в глобальное пространство

    Есть предложение полностью уйти от привязки к именам, как в пыхе, а использовать их только, если это действительно стоящее название. И вариант с методом filter только доказывает, что это нужно.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    фильтр ессно будет работать с массивами.

    $params = null - наверно в некоторых случаях нужно будет засылать дополнительные параметры (типа не преобразовывать " в ")

    array_get_range - потом будет вынесен в обертку для массивов, гыгы.
     
  4. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    тогда, чтобы не загромождать парамтреми можно сделать через побитовое сравнение:
    PHP:
    1. <?
    2. // Decode
    3. Str::filter($string, Str::HTML | 1, $params);
    4. Str::filter($string, Str::HTML | Str::DECODE, $params);
    5. // Encode
    6. Str::filter($string, Str::HTML | 0, $params);
    7. Str::filter($string, Str::HTML | STR::ENCODE, $params);
    8. Str::filter($string, Str::HTML, $params);
    9.  
    10. // Add
    11. Str::filter($string, Str::SLASHES | 1, $params);
    12. Str::filter($string, Str::SLASHES | Str::ADD, $params);
    13. // Strip
    14. Str::filter($string, Str::SLASHES | 0, $params);
    15. Str::filter($string, Str::SLASHES | STR::STRIP, $params);
    16. Str::filter($string, Str::SLASHES, $params);
    17.  
    Главное - надо будет следить, чтобы константы в двоичном представлении обязательно на "нуль" заканчивались. Это все парные числа. Естественно,
     
  5. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Кстати, есть еще quotemeta и htmlentities. Но у меня вопрос:
    Сколько вы знаете примеров использования quotemeta, htmlentities и addcslashes, которые были бы не те самые цели, что осуществляются addslashes и htmlspecialchars? Хотя, класс рассчитан на расширение функционала, может, тут лучше им пожертвовать, как думаете?
     
  6. +1
    Хеширование тоже выкинуть
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    так-с, я создал другую ветвь
    http://code.google.com/p/strclass/sourc ... 43911f68bb
    и в нее закоммитил изменения по поводу changeCase. А именно: логика сделана как здесь http://www.php.ru/forum/viewtopic.php?p=162590#162590 . Правда еще не все режимы работают.

    Но имхо: гавно выходит. Не знаю почему, но мне старая логика нравится больше.
    Кода получается много, польза сомнительна. Проще наверно добавить какой-нить invertCase



    зы: расчехлите как работать с тегами и бранчами в Mercurial.
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Не вижу в коде изменений.
    В данном случае старая логика действительно лучше. В той теме я давал просто пример.
     
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    там сверху есть переключение между бранчами. Cм скрин
    [​IMG]


    подождем, что скажут другие товарищи: откатить на старый changeCase и добавить invertCase или допилить измененный.
     
  10. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    В "Default" вообще старый вариант:
    Код (Text):
    1. case self::UP:
    2. case self::DOWN:
    3. case self::FIRST_UP:
    4. case self::TITLE:
    В "another..."
    Код (Text):
    1.  
    2.     public static function changeCase($string, $what = self::ALL, $mode = self::UP)
    3.         {
    4.                 switch ($mode) {
    5.                         case self::UP:
     
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну да.
    PHP:
    1. <?php
    2. changeCase('строка из нескольких слов') // все в верхний регистр
    3. changeCase('строка из нескольких слов', Str::TITLE, STR::DOWN_FORCED) // первые буквы каждого слова в нижний, остальные в верхний - в старой версии так нельзя сделать.
    4. changeCase('строка из нескольких слов', Str::TITLE, STR::UP) // первые буквы каждого слова в верхний, остальные не трогать.
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Koc, понял, извини, что-то я увидел Str::ALL | Str::FIRST | Str::TITLE и подумал, ты про побитовое сравнение :))
    Все же я считаю, что этот вариант лучше. Он логичнее, более расширяем и удобней
    Логичнее - потому что логично объясняется: "Сначала мы выбираем символы с которыми работаем, потом - что с ними делаем"
    Более расширяем - потому что если ты захочешь добавить изменение регистра, скажем, первого слова - ты добавляешь одну константу Str::FIRST_WORD, если захочешь изменить регистр последних букв каждого слова - добавляешь константу Str::LAST_LETTERS.
    Удобней, имхо, выплывает из первого пункта. Для меня логичнее значит удобнее.
     
  13. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    работа кикпит. когда релиз с докой ждать?
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    может к концу недели смогу допилить
     
  15. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Доку я сделаю очень быстро.
     
  16. Ребят, вы молодцы. Правда :)
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    флоппик
    хе-хе, спасибо.

    Небольшое обновление. Пока еще не все комбинации работают в changeCase. Кто хочет помочь - смотрите //TODO - эти куски не работают. Знаете как сделать их рабочими - вэлком с кодом ко мне.

    К примеру я не шарю как отделять первый символ слова от остальных.

    Также я добавил 2 новых режима: INVERT и RANDOM
    к примеру
    Str::ChangeCase($str, Str::ALL, Str::INVERT) // инвертирует регистр всей строки
    Str::ChangeCase($str, Str::ALL, Str::RANDOM) // по идее должна сделать "имбецильную" строку. Как здесь
     
  18. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Кстати, насчет decode64:

    PHP:
    1. <?
    2.  
    3. Str::Base64($string, DECODE);
    4. Str::Base64($string, ENCODE);
    5.  
    6. ?>
    Можно примерно так.
    Ну это только предложение :)
     
  19. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    о, я только за. А urlsafe впихнем последним атрибутом.
     
  20. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
  21. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    да читал я, читал. Пока не знаю ф-ций обратимого шифрования нормальных. Если знаешь - кидай ссылки и как их обозвать.

    Хотя в чем преимущество самопимных перед basr64?
     
  22. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    А тут есть японские символы

    PHP:
    1. <?php
    2.     header('Content-type: text/plain; charset="utf-8"');
    3.     $string = "PHP - мова, яка може !бути! вбудована безпосередньо в html-код сторінок.";
    4.     $title = preg_replace_callback("/([\p{L}\p{Nd}]+)/u", 'printPart', $string);
    5.  
    6.     function printPart ($m) {
    7.         /* тут $m[0] - это каждое отдельное слово строки.
    8.          * Работаешь с ним и возвращаешь новое, на которое оно и заменится.
    9.          * Например:
    10.          */ return "_" . $m[0] . "_";
    11.     }
    12.     // _PHP_ - _мова_, _яка_ _може_ !_бути_! _вбудована_ _безпосередньо_ _в_ _html_-_код_ _сторінок_.
    13.     echo $title;
    14. ?>
     
  23. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Koc, я вообще говорю про предложение.

    Самописные. Ну например , двойной квадрат и xor-шифрование. Преимущества перед base принципиального нету. Только разнообразие :) Хотя я и бейзом то никогда не пользовался.
     
  24. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    "rand(0, 1) == 1 ?" можно заменить на "rand(0, 1)" :)

    added:
    PHP:
    1. <?php
    2. // и вообще я бы поменял
    3.     $char = self::caseInvert($char);
    4.     rand(0, 1) == 1 ? $char = self::caseInvert($char) : null;
    5. // не понял, зачем дважды символ инвертируется
    6.     $сhar = rand(0, 1) ? self::caseInvert($char) : $char;
    7.  
    8. // А во всех функциях заменить
    9.     for ($i = 0; $i < mb_strlen($string); $i++)
    10. // Потому что в предыдущем варианте при каждом проходе цикла происходит подсчет длины строки, которая не меняется
    11.     for ($i = 0, $c = mb_strlen($string); $i < $c; $i++)
     
  25. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    Да то ацкей копипаст из комментов php.net/manual . Я почему-то не догадался как инвертировать регситр. Думал даже что только через str_pad и регулярки это возможно.

    PHP:
    1.  
    2. <?
    3. for ($i = 0; $i < strlen($string); $i++) { // плохо
    4.  
    5. // а так лучше
    6. $n = strlen($string);
    7. for ($i = 0; $i < $n; $i++) {