За последние 24 часа нас посетили 18400 программистов и 1644 робота. Сейчас ищут 1732 программиста ...

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

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

  1. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    это я переименовывал caseLetters в changeCase. И вроде ж использовал найти и заменить во всем проекте, а заменило не везде. phpDesigner удобен, но к рефакторингу не располагает.

    обновил немного и документацию

    upd: сейчас вроде норм должно быть. У меня примеры нормально отрабатывают.

    эта, FIRST наверно будет удаляться и заменяться на LEFT. Поэтому FIRST_UP наверно пока пусть побудет
     
  2. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    а вообще - если я захочу сделать все большыми, кроме первых букв каждого слова?
    предлагаю так:
    Str::changeCase(
    $string,
    [ Str::ALL | Str::FIRST | Str::TITLE ],
    [ Str::DOWN | Str::UP | Str::DOWN_FORCED | Str::UP_FORCED ]
    );
    Захотел сделать все буквы большими -
    Str::changeCase($string, Str::ALL, Str::UP);
    Первую - маленькой, остальные - большими:
    Str::changeCase($string, Str::FIRST, Str::DOWN_FORCED);
    Первую каждого слова большими - остальные - маленькими:
    Str::changeCase($string, Str::TITLE, Str::UP_FORCED);
    И так далее
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а может сделать метод negativeCase?

    чат сегодня здесь)

    зы: обновил предыдущий пост

    хотя и предложеный выше вариант стоит реализовать
     
  4. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Koc, не. мне сначала тоже показалось, что мой способ тяжеловат, но:
    второй параметр - выбираем, с какими символами будем работать Str::ALL - со всеми, Str::FIRST - с первый, Str::TITLE - с первым, в каждом слове
    третий параметр - что будем с ними делать: Str::DOWN - приводим к нижнему регистру, Str::UP - приводим к верхнему регистру, Str::DOWN_FORCED - приводим к нижнему регистру, а все остальные - к верхнему, Str::UP_FORCED - приводим к верхнему регистру, а все остальные - к нижнему. Все логично и понятно.
     
  5. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ок, завтра сделаю.
     
  6. kostyl

    kostyl Guest

    Да влом писать. Короче говоря было бы неплохо если бы класс проверял, перезагружены ли функции и если они перезагружены, то реализовывал бы методы многобайтного режима для неперезагруженных функций. Чтото типа того...
     
  7. TheShock

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

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

    http://php.freecr.ru/

    Добавление и редактирование происходит путем редактирования xml-кода. Несколько функций написал маны - очень легко и быстро. Можно заметить идеологически-верные ссылки:
    http://php.freecr.ru/manual/Str/trim/
    Предлагаю дальнейшим основным полигоном для мануала и обсуждений использовать именно этот скрипт.
    Естественно, над дизайном я пока не работал.
    При положительном отзыве продолжу разработку скрипта, прикручу комменты и т.п.
    Преимущества и недостатки перед расположением на google.com, я думаю, очевидны.
    Ну и готов оказать помощь в написании манов.

    HTML:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <method class='Str' classDescr='Строковые функции' name='length' descr='Возвращает длину строки'>
    3.     <block name='Описание'>
    4.         <pattern>string length(string $string)</pattern>
    5.         Возвращает длину строки $string.
    6.         <example title='Пример использования Str::length()'>
    7. <?php
    8.     echo Str::length('Строка'); // 6
    9.     echo Str::length(' С т р о к а '); // 13
    10. ?>
    11.         </example>
    12.     </block>
    13.     <block name='Возвращаемые значения'>
    14.         Длина строки $string
    15.     </block>
    16. </method>
     
  8. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    kostyl
    не, пока остаемся зимовать, вернее оставлю то, что есть

    TheShock
    о-го-го, наверно я тогда не смогу писать мануалы, синтаксис жжосткий =).

    из минусов: отсутствие ревизий (нельзя откатывать изменения в мануале), синтаксис не вики а свой. Мне вообще все равно что с этим мануалом, я и так пока что понимаю. А потом добавлю phpdoc к главному Str классу и будет совсем хорошо.

    Вернее я знаю, что мануал на вики гугла это не ксть гуд, я в любом случае планировал его перемещать потом на какой-то поддомен *.brouzie.com, обязательно с кнопочкой donate, бгг.

    В общем если есть желание: пиши. Я ссылку на google-code повешу.
     
  9. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Берется уже готовый хмл-документ, и редактируются поля. :)

    Ревизий - нету, да. Хотя сделать, нетяжело.
    Синтаксис можно любой тоже сделать - это один класс поменять. Я сначала думал в стиле BB-Code придумать. Но текущий синтаксис реально удобный.

    ps. ненавижу phpdoc :) во всех либах, которые скачиваю - удаляю все пхпДок кумментарии. в первую очередь

    * Написал в личку
     
  10. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    phpdoc не люблю когда что-то разрабатываю. Если б моя IDE могла показывать его при автодополнении и скрывать при редактировании, при этом строки сжимая - было б круто.
     
  11. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Koc
    Поетому лучше пользоваться ZDE или чем-то подобным, поддерживающим code folding и phpDoc completion :)

    phpDocumentator генерирует документацию в куче форматов, так что есть очень большой резон по использованию phpDoc - обновляться дока будет практически одной командой (я не работал с phpDocumentator, но насколько я знаю - дело обстоит так).
     
  12. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    еще как интересно. я постоянно об этом думаю.

    Точно такие же обертки нужны для файлов, сокетов, картинок, почты, массивов, денег, шифрования, и всего всего остального. Для дат к счастью они сами уже додумали. долго соображают.

    А в цепочки твои класс можно будет связывать, как в том блоге, который тебе навеял идею? типа
    PHP:
    1. <?php
    2. $str->add("asdfas")->preg_replace("слоны","коровы")->upeer()->base64()

    И еще об одном прошу подумать. Библиотека, мне кажется, нравятся или не нравятся нам всем имена стандартных функций, должна повторять их. это как всегда в жизни, надо пожертвовать маленьким благом во имя большего.

    PHPDoc однозначно да. Тоже стандарт.
     
  13. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Это статичный класс. Захочешь - сам потом переделаешь, чтобы так было. Я вот собираюсь переделать :)

    Не согласен, читай обсуждение выше.
     
  14. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в репозиторий добавлен метод Str::rev - улучшенная ф-ция strrev. Добавлены параметры int $from, int $to. То есть можно зеркалить не всю строку а только с $from символа. Или с $from до $to символов


    Но тут возникают вопросы:
    что если Str::length($str) < $to
    или $to < $from
    я должен обрабатывать как-то некорректные данные от пользователя?
    или лучше заменить $to на $length (сколько символов отражать)?

    и пришлось добавить отдельно ф-цию array_get_range


    alexey_baranov
    это уже нужно будет написать еще одну обертку над Str классом). Посмотрим, может сделаю.

    Psih
    Zend большой и неповоротливый(. У меня даже нет столько места свободного, что б скачать его. Есть netbeans 6.7, но там такое дурацкое автодополнение ф-ций.


    зы: как из репозитория удалить папки старые?
     
  15. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Метод slice, по анологии с array_slice().
    PHP:
    1. <?
    2. function slice($string, $offset, $len = null){
    3.     return join('', array_slice(str_split($string), $offset, $len));
    4. }
    Попытка воссоздать $string[0] - str::slice($string, 0, 12).

    Разбиваем строку на массив, делаем ему array_slice(), потом обьеденяем строку обратно. Косяк может быть в функции str_split(), не знаю насколько быстро она работает и с каким обьёмом.

    P.S. Удалять старые папки из SVN: если средствами ЧерепашкиSVN, то надо сделать обзор хранилища и из этого окна удалять. А вот как через командную строку хз.
     
  16. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Psih
    ща вроде 7-я версия Зенда вышла. И он платный вроде? хотя phpDesigner тоже платный, бгг

    зы: чего форум недоступен через php.ru/forum? выдает 404. А через www.php.ru/forum все ок

    lexa
    у меня репозиторий - mercurial. Вроде когда использовал на локалке truc то все удаляло автоматом. Я же делаю коммит, потом push его на сервер. Странно.
     
  17. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    lexa
    хм, а в чем различие slice от substr?
     
  18. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Koc, ыгыгы. Ни-ка-ких различий нет. Это я туплю. Не спал вторые сутки. Пошёл за кофе и тааак мне моя придумка понравилась, что я совершенно позабыл про substr().

    P.S. Серьёзно, я был так восхищён своей идеей. Блин.
     
  19. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну ваще substr я пока не добавлял в класс. Нужно подумать как расширить его. Или оставить как есть.

    сон важен для продуктивной работы и жизни в целом). Имхо не стоит себя так терзать.
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
  21. TheShock

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

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

    kostyl Guest

    Мне тут тоже подобный класс понадобился поэтому немного напишу как у меня:
    PHP:
    1.  
    2. <?php
    3.     /**
    4.      * @param string $sString
    5.      * @param int $iStart
    6.      * @param int $iLength
    7.      */
    8.     static function Substr($sString, $iStart, $iLength)
    9.     {
    10.         if (self::NeedUseMBFuncs(2)) {
    11.             return mb_substr($sString, $iStart, $iLength, self::$sEncoding);
    12.         }
    13.         else {
    14.             return substr($sString, $sString, $iLength);
    15.         }  
    16.     }
    17.     /**
    18.      * @param int $iOvelroadBitmask
    19.      * @return bool
    20.      */
    21.     private function NeedUseMBFuncs($iOvelroadBitmask)
    22.     {
    23.         return (self::$_iMode && self::$_iOverloadBitmask) ? (!($iOvelroadBitmask & self::$_iOverloadBitmask)) : self::$_iMode;
    24.     }
    25.  
     
  23. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    kostyl, у Коса это уже реализовано красивее :)
     
  24. kostyl

    kostyl Guest

    А как насчет посмотреть?
     
  25. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk