PHP Много Байт str_replace?

Что такое Неизменность?

  • Неизменность применяется, прежде всего, к объектам (строки, массивы, пользовательский класс Животных)
  • Как правило, если существует неизменная версия класса, изменяемая версия также доступна. Например, Objective C и Какао определяют и (неизменный) класс NSString и класс NSMutableString.
  • , Если объект неизменен, он не может быть изменен после того, как он создается (в основном только для чтения). Вы могли думать о нем как, "только конструктор может изменить объект".

Это непосредственно не имеет никакого отношения к вводу данных пользователем; даже Ваш код не может изменить значение неизменного объекта. Однако можно всегда создавать новый неизменный объект заменить его. Вот псевдопример кода; обратите внимание, что на многих языках можно просто сделать myString = "hello"; вместо того, чтобы использовать конструктора, как я сделал ниже, но я включал его для ясности:

String myString = new ImmutableString("hello");
myString.appendString(" world"); // Can't do this
myString.setValue("hello world"); // Can't do this
myString = new ImmutableString("hello world"); // OK

Вы упоминаете "объект, который просто возвращает информацию"; это автоматически не делает это хорошим кандидатом на неизменность. Неизменные объекты имеют тенденцию всегда возвращать то же значение, с которым они были созданы, таким образом, я склонен сказать, что текущее время не было бы идеально, так как это часто изменяется. Однако у Вас мог быть класс MomentOfTime, который создается с определенной меткой времени и всегда возвращает ту одну метку времени в будущем.

Преимущества Immutabilty

  • при передаче объекта другой функции/методу Вам не придется волноваться о том, будет ли тот объект иметь то же значение после функциональных возвратов. Например:

    String myString = "HeLLo WoRLd";
    String lowercasedString = lowercase(myString);
    print myString + " was converted to " + lowercasedString;
    

    , Что, если реализация lowercase() изменила myString, поскольку это создавало строчную версию? Третья строка не дала бы Вам результат, который Вы хотели. Конечно, польза lowercase() функция не сделала бы этого, но Вам гарантируют этот факт, если myString будет неизменен. По сути, неизменные объекты могут помочь осуществить хорошие методы объектно-ориентированного программирования.

  • легче сделать неизменный объект ориентированным на многопотоковое исполнение

  • , Это потенциально упрощает реализацию класса (хороший, если Вы - тот, пишущий класс)

состояние

, Если бы необходимо было взять все переменные экземпляра объекта и записать их значения на бумаге, которая была бы состоянием того объекта в тот данный момент. Состояние программы является состоянием всех своих объектов в данный момент. Изменения состояния быстро со временем; программа должна изменить состояние, чтобы продолжить работать.

Неизменные объекты, однако, фиксировали состояние со временем. После того, как созданный, состояние неизменного объекта не изменяется, хотя состояние программы в целом могло бы. Это помогает отслеживать то, что происходит (и посмотрите другие преимущества выше).

12
задан Ian 20 September 2009 в 15:10
поделиться

3 ответа

Похоже, строка не была заменена из-за несоответствия входной кодировки и кодировки файла.

5
ответ дан 2 December 2019 в 05:28
поделиться

Попробуйте это определение функции:

if (!function_exists('mb_str_replace')) {
    function mb_str_replace($search, $replace, $subject) {
        if (is_array($subject)) {
            foreach ($subject as $key => $val) {
                $subject[$key] = mb_str_replace((string)$search, $replace, $subject[$key]);
            }
            return $subject;
        }
        $pattern = '/(?:'.implode('|', array_map(create_function('$match', 'return preg_quote($match[0], "/");'), (array)$search)).')/u';
        if (is_array($search)) {
            if (is_array($replace)) {
                $len = min(count($search), count($replace));
                $table = array_combine(array_slice($search, 0, $len), array_slice($replace, 0, $len));
                $f = create_function('$match', '$table = '.var_export($table, true).'; return array_key_exists($match[0], $table) ? $table[$match[0]] : $match[0];');
                $subject = preg_replace_callback($pattern, $f, $subject);
                return $subject;
            }
        }
        $subject = preg_replace($pattern, (string)$replace, $subject);
        return $subject;
    }
}
2
ответ дан 2 December 2019 в 05:28
поделиться

Можно удалить диакритические знаки, используя форму нормализации Юникода D (NFD) и свойства символов Юникода.

NFD преобразует что-то вроде умляута «ü» из «LATIN SMALL» БУКВА U С ДИАРЕЗИСОМ "(которая является буквой) до" СТРОЧНАЯ ЛАТИНСКАЯ БУКВА U "(буква) и" ОБЪЕДИНЕНИЕ ДИАРЕЗА "(не буква).

header('Content-Type: text/plain; charset=utf-8');

$test = implode('', array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'));

$test = Normalizer::normalize($test, Normalizer::FORM_D);

// Remove everything that's not a "letter" or a space (e.g. diacritics)
// (see http://de2.php.net/manual/en/regexp.reference.unicode.php)
$pattern = '/[^\pL ]/u';

echo preg_replace($pattern, '', $test);

Вывод:

aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn

Класс нормализатора является частью Пакет PECL intl . (Сам алгоритм не очень сложен, но он должен загружать множество отображений символов afaik. Я написал реализацию PHP некоторое время назад.)

(Я добавляю это на два месяца позже, потому что я думаю, что это хорошая техника, которая недостаточно широко известна.)

3
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: