PHP-независимый от регистра эквивалент strtr

Где я могу найти нечувствительную к регистру версию strtr?

strtr перегружен, я говорю о следующем

string strtr ( string $str , array $replace_pairs )

person fbiville    schedule 23.09.2011    source источник
comment
@ c69, прочитай еще раз название функции. Это strtr, а не strstr.   -  person binaryLV    schedule 23.09.2011
comment
@binaryLV проклятый php и его имена функций ›_‹ они не очень удобны для чтения   -  person c69    schedule 23.09.2011
comment
@ c69, это не только PHP. Стандартная библиотека C также имеет удивительные имена для функций. Взгляните на string.h (strcspn()?!), например ; )   -  person binaryLV    schedule 23.09.2011


Ответы (1)


Используйте str_ireplace:

str_ireplace(array_keys($replace_pairs), array_values($replace_pairs), $str);
person Arnaud Le Blanc    schedule 23.09.2011
comment
работает (почти) отлично! Единственная незначительная проблема заключается в том, что символы верхнего регистра превращаются в строчные... Но, думаю, я могу с этим смириться. - person fbiville; 23.09.2011
comment
str_ireplace(array('A'), array('Z'), "ABcd") возвращает ZBcd, это не меняет регистр входной строки. - person Arnaud Le Blanc; 23.09.2011
comment
str_ireplace (массив ('a'), массив ('z'), 'ABcd'); делает ;) - person fbiville; 23.09.2011
comment
очевидно, он заменяет то, что вы говорите ему заменить;) вместо этого сделайте str_replace(array('a','A'),array('z','Z'), 'ABcd'); - person Arnaud Le Blanc; 23.09.2011
comment
Да, я знаю. Однако у меня нет информации о строке, которую я хочу обработать. Если я хочу заменить весь набор слов, я должен сгенерировать всю комбинацию символов нижнего/верхнего регистра? Представьте, что у вас всего 1 слово из трех букв: bob, boB, bOb, bOB, Bob, BoB, BOb, BOB. Проблема в том, что у меня есть n слов разной длины. Генерация всех возможных комбинаций только для того, чтобы сохранить случай, кажется, требует больших накладных расходов. - person fbiville; 24.09.2011
comment
А с незападными алфавитами я даже не знаю, как следует обращаться с регистром. - person fbiville; 24.09.2011
comment
ОК: stackoverflow.com/questions/2750736/ кажется, решает эту второстепенную проблему. Я все еще считаю ваш ответ действительным в любом случае :) - person fbiville; 24.09.2011
comment
Помните, что это создает проблему, когда вы, например, заменяете весь номер, тогда вы больше не можете его расшифровать. Он заменяет последовательно, а не одновременно, как это делает strtr! - person twicejr; 14.11.2013
comment
Обратите внимание, что str_replace()/str_ireplace() функционально отличаются от strtr() тем, как они выполняют замены. Если вы используете первый со значениями, предоставленными пользователем, вы можете столкнуться с уязвимостью, связанной с внедрением кода. - person Courtney Miles; 08.08.2017
comment
Проблема в том, что str_replace и str_ireplace в 4 раза медленнее, чем strtr - person Shakeel Ahmed; 25.08.2018
comment
Это хороший ответ, поскольку он использует тот же массив формата, что и strtr, благодаря array_keys и array_values. Я упоминаю об этом, потому что я начал писать функцию преобразования до того, как понял. - person MortimerCat; 10.07.2020