та работа-ебота, времени сейчас пока совсем мало. Давай план действий обрисуем, а я его выполню: 1) обновить ф-цию take 2) добавить size ...
как минимум еще "replace" (ооочень часто используется). Ну и выше гдето в теме я говорил, каких функций не хватает.
http://code.google.com/p/strclass/source/list обновил маленько, а именно: изменен метод reverse, теперь второй параметр - длина строки, которую нужно отразить зеркально добавлен метод size для получения размера строки обновлен метод take. По идее повышение производительности =) далее: нужно разобраться с методом фильтра.
Код (Text): foreach ($what as $w) { foreach лучше таки, имхо, в таком классе не использовать (он работает с копией, а потому - дополнительные потери памяти, афаик). а использовать обратный for PHP: <?php for ($c = count($what); $c--;) { $p = self::find($what[$c], имхо, в данном случае лучше малость пожертвовать очевидностью и легкостью коду в пользу быстродействия и уменьшения потребления памяти Медленный модификатор /u так и не убран. Предлагаю так. Можно еще добавить CSLASHES: PHP: <?php public static function filter($string, $mode, $add = false) { switch ($mode) { case self::SLASHES: return $add ? addslashes($string) : stripslashes($string); case self::TAGS: return strip_tags($string); case self::HTML: return $add ? htmlspecialchars_decode($string): htmlspecialchars($string); } } ?>
я тут делал автокомплит для консольного форума и сделал одну небольшую функцию, может и тут сделать? Код (Text): compare ($str1, $str2, $mode = Str::LEFT) $mode = [ Str::LEFT | Str::RIGHT | Str::FULL] Мне нужна была только Str::LEFT, но мало ли. Суть в следующем. Две строки сравниваются слева и выбирается одинаковый участок. Например: <?php compare('Картошка', 'Картограф'); // 'Карто' compare('Красная', 'Зеленая', Str::RIGHT); // 'ная' compare('Про рамы и окна', 'Программирование', Str::FULL); // 'Прорамн' ?> Код (Text): Про рамы и окна Программирование Про*рам******н** => Прорамн Не знаю, насколько нужен Str::FULL и Str::RIGHT - мне нужна была только Str::LEFT. Но, может, для того, чтобы узнать, насколько две строки отличаются? И вот метод сравнивания, который я писал для Str::LEFT PHP: <?php function compare ($str1, $str2) { $result = ''; $L1 = strlen($str1); $L2 = strlen($str2); for ($k = 0; $k < $L1 and $k < $L2; $k++) { if ($str1[$k] === $str2[$k]) { $result .= $str1[$k]; } else { break; } } return $result; } ?>
Koc, добавь, пожалуйста, в класс "class Str extends StrCommon implements IStr" следующий метод: Код (Text): public static function getMode() { return self::$mb; }
Иха! Гугл исправил баг с отображением удаленных когда-то директорий в source view. http://code.google.com/p/strclass/sourc ... e15e6f8e1# фильтр сделал рекурсивный не тестил сравнением строк пока тоже еще не занимался.
ага, мне уведомление на почту пришло, сенг. вроде поправил. Когда делаем UP/DOWN для TITLE модификатор /u нельзя убирать, mb_strtoupper/mb_strtolower корежит строку по поводу mb_substr_count - бугого. Думал, что у нее такие же параметры как и у substr_count. Что ж, это только добавило плюсов к StrClass - у нас все параметры одинаковые, что для юникода, что для аскии.
В сообщении на шестой странице я писал, что модификатор /u тут не нужен, приводя доказательство: PHP: <?php $string = "Тестовая строка here"; function invertCharCase ($c) { return ($c == mb_strtolower($c)) ? mb_strtoupper($c) : mb_strtolower($c); } function randInvert($m) { return rand(0, 1) ? invertCharCase($m[0]) : $m[0]; } echo preg_replace_callback ("/([\p{L}\p{Nd}])/u", 'randInvert', $string), "\n"; echo preg_replace_callback ("/([\p{L}\p{Nd}])/", 'randInvert', $string), "\n"; ?> Когда у меня был php 5.2.* - действительно работало без модификатора /u отлично. После проверки на php 5.3.0 был неприятно удивлён. Видимо в новой версии "пофиксили" этот кусок. Жалко
Но, должен сказать, пофиксили они его на славу: Код (Text): = pregInvert 10000 = 3.954794883728 3.807187795639 = strInvert 10000 = 15.424659967422 15.520486831665 = pregInvert 500 = 0.18616509437561 0.20838403701782 = strInvert 500 = 0.26548385620117 0.27108097076416 PHP: <?php /*********************** * strInvert.php ***********************/ mb_internal_encoding('UTF-8'); header('Content-type: text/plain; charset="utf-8"'); $string = ''; // Строка echo mb_strlen($string) . ' '; function caseInvert($string) { $nstr = ''; $c = mb_strlen($string); for ($i = 0; $i < $c; $i++) { $char = mb_substr($string, $i, 1); // if it's lower case make it upper case if ($char == mb_strtolower($char)) { $char = mb_strtoupper($char); // if it's upper than make it lower } else { $char = mb_strtolower($char); } $nstr .= $char; } return $nstr; } // randomly capilizes/uncaptilizes chars in a string function caseRand($string) { $nstr = ''; $c = mb_strlen($string); for ($i = 0; $i < $c; $i++) { $char = mb_substr($string, $i, 1); rand(0, 1) ? $char = caseInvert($char) : null; $nstr .= $char; } return $nstr; } $start = microtime (1); for ($i = 50; $i--;) { $randInverted = caseRand($string); } echo (microtime(1) - $start), "\n"; ?> PHP: <?php /*********************** * pregInvert.php ***********************/ mb_internal_encoding('UTF-8'); header('Content-type: text/plain; charset="utf-8"'); $string = ''; // Строка echo mb_strlen($string) . ' '; function invertCharCase ($c) { return ($c == mb_strtolower($c)) ? mb_strtoupper($c) : mb_strtolower($c); } function randInvert($m) { return rand(0, 1) ? invertCharCase($m[0]) : $m[0]; } $start = microtime (1); for ($i = 50; $i--;) { $randInverted = preg_replace_callback ("/([\p{L}\p{Nd}])/u", 'randInvert', $string); } echo (microtime(1) - $start), "\n"; ?>
Koc, в php 5.2.* [\p{L}\p{Nd}] работает корректно несмотря на модификатор /u В php 5.3.0 работает корректно только с этим модификатором. но в php 5.3.0 модификатор /u работает значительно быстрее. итог: надо ставить
короче нужно вернуть все эти модификаторы на место? или можно вынести паттерны в переменные в common-классе и в зависимости от версии пыха менять значения этих переменных.
Koc, вообще паттерны желательно таки куда-то вынести. учитывая их повторяемость и необходимость обозначить, что этот паттерн значит. Думаю, не стоит парится, а делать с рассчетом на php 5.3 , но с поддержкой 5.2. С модификатором /u будет работать везде, а если человек сознательно не переходит на новую версию, то он должен понимать, что в 5.3 сделаны улучшения в плане скорости. В том числе в либах
Старался описать и, мне кажется, что filter таки не очень логичен. Вариант первый: $add заменить на $escape return $escape ? "строка экранировалась" : "строка деэкранировалась"; потому что пока Код (Text): case self::SLASHES: return $add ? "Строка экранируется" : "Строка деэкранируется"; case self::HTML : return $add ? "Строка деэкранируется" : "Строка экранируется"; Возможно, убрать третий параметр и вернутся к пяти константам (SLASHES, SLASHES_REMOVE, HTML, HTML_DECODE, TAGS) Второй вариант мне нравится больше.
Полностью обновил мануал. Добавил все методы кроме filter (не знаю, как описать). Особенно постарался с методом format =) Предлагаю оставить ссылку на проект на Гуглокоде и на мануал в первом сообщении. И предлагаю на главной странице проекта добавить несколько примеров. Чтобы разнообразить главную страницу
окей, завтра сделаю, спасибо за руководство. Я начал писать его для класса-пагинатора - реально сложно. с фильтром огорчил. Изначально ж т было N констант. Ну и с паттернами завтра разберемся. Странно они делают: одно фиксят, другое ломают зы: я иногда просто давал бы отсылку на подобную функцию на пыхе. Например в том же формате прототипом служил sprintf, можно дать отсылку на все эти %d, %s. Хотя у тебя это подробней описано и примеров больше. И еще формат поддерживает массив в виде 2 аргумента.
аха, я помню... работа над руководством очень помогает: 1. Найти баги в коде - потому что пишешь много примеров 2. Найти логические ошибки - потому что стараешься объяснить, а оно - не идет.
и еще: да, я помню, что хорошо б сделать возможность обрезать по 1) кол-ву слов, 2) по буквам, но что б слова не резать. В какой метод это добавить и какими параметрами - вопрос. что там решили со сплитом, explode/implode? делать или это к массивам? что если в trim добавить возможность задавать charlist так, чтобы обрезались символы по умолчанию (пробелы) + указанные в чарлисте?