str_replace в кодировке utf-8

AmdY

Пью пиво
Команда форума
phprus, fixxxer а разве не возможна ситуация, когда str_replace найдёт в 3-4 байтовом символе вхождение меньшего 1-2 байтового? чёто здесь у меня пробел организовался, но в лом читать доки.
 

fixxxer

К.О.
Партнер клуба
Вурдалак

Хе-хе. А ведь притом имеем:

Код:
~$ php -r 'var_dump(strtr("abcd", array("ab"=>"xx","xx"=>"yy")));'
string(4) "xxcd"

~$ php -r 'var_dump(str_replace(array("ab","xx"),array("xx","yy"),"abcd"));'
string(4) "yycd"
Где-то strtr написан левой пяткой :D

Так то, похрен, конечно, на такие нанооптимизации. Но все же, это все забавно =)
 

Вурдалак

Продвинутый новичок
Потому что там вообще нет никакого алгоритма поиска подстроки, тупо отрезается кусок длины, совпадающей с длиной некоторой заменяемой подстроки, потом сравнивается и, в случае неудачи, всё сдвигается на 1 символ.
PHP:
function strtr_php($s, $replacePairs)
{
    $maxlen = 0;
    $minlen = 42;

    foreach($replacePairs as $k => $v) {
        $maxlen = max(strlen($k), $maxlen);
        $minlen = min(strlen($k), $minlen);
    }

    $p = 0;
    $r = '';

    while( $p < strlen($s) ) {
        if( ($p + $maxlen) > strlen($s)) {
            $maxlen = strlen($s) - $p;
        }

        $found = FALSE;

        for($len = $maxlen; $len >= $minlen; $len--) {
            $key = substr($s, $p, $len);

            if( isset($replacePairs[$key]) ) {
                $r .= $replacePairs[$key];
                $p += $len;
                $found = TRUE;
                break;
            }
        }

        if( ! $found ) {
            $r .= $s[$p++];
        }
    }

    $r .= substr($s, $p);

    return $r;
}
-~{}~ 23.10.10 21:23:

В случае массива типа
PHP:
$replacePairs = array('a' => '?', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' => '?');
будет выполняться куча аболютно лишних итераций (из-за большой разницы длин двух ключей).

-~{}~ 23.10.10 21:39:

P.S. Тыц
 

fixxxer

К.О.
Партнер клуба
Мда :)

Короче пофиг, если что-то там требует массы реплейсов то все равно всегда проще и выгоднее заранее заменить на набор условных конкатенаций.
 
Сверху