Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Multibyte strtr
Форумы портала PHP.SU » PHP » Программирование на PHP » Multibyte strtr

Страниц (1): [1]
 

1. Viper - 04 Августа, 2010 - 10:37:16 - перейти к сообщению
На одном форуме есть тема

С неё и начал. Проблема в том что хочется чтобы функция работала так же как и нативная в php. Т.е. можно было бы указывать 2 параметра вместо 3х: 1 строка, 2 ассоциативный массив с ключ=>значение.

На данный момент есть вот что

PHP:
скопировать код в буфер обмена
  1. function mb_strtr($str, $from, $to='') {
  2.         $keys = array();
  3.         $values = array();
  4.  
  5.         if (empty($to) && is_array($from)) {
  6.                 $keys_temp = array_keys($from);
  7.                 $values_temp = array_values($from);
  8.                 preg_match_all('/./u', $keys_temp, $keys);
  9.                 preg_match_all('/./u', $values_temp, $values);
  10.                 $mapping = array_combine($keys[0], $values[0]);
  11.  
  12.                 return strtr($str, $mapping);
  13.         } else {
  14.                 preg_match_all('/./u', $from, $keys);
  15.                 preg_match_all('/./u', $to, $values);
  16.                 $mapping = array_combine($keys[0], $values[0]);
  17.  
  18.                 return strtr($str, $mapping);
  19.         }
  20. }


Проблема с первой частью if'а. Т.е. в preg_match нужно передавать 2-ым параметром строку, а не массив как у меня.

Как можно обойти данную проблему "меньшей кровью" ?
2. JustUserR - 04 Августа, 2010 - 15:14:47 - перейти к сообщению
Viper пишет:
Как можно обойти данную проблему "меньшей кровью" ?
По идее в том случае когда вашей функции передается массив с заменяемыми символами - то выполнять никаких дополнительных преобразований не требуется поскольку данные и так находятся в требуемом формате Но так как основной целью видимо является использования регулярного выражения с multibyte-модификатором - то можно сначала выполнить преобразование переданного массива в строку - а потом обработать его с помощью того PHP-кода который приведен в else-ветки По идее отражение сущности работы с multibyte-строками должно сохраниться - потому что в той части PHP-кода которая претерпела изменение использовалось полное копирование строк без их посимвольного разбора - и соответственно если даже трактуемая кодировка была неправильной то строки остались неизменными
Конкретно имелся в виду следующий PHP-код
PHP:
скопировать код в буфер обмена
  1. function mb_strtr($str, $from, $to='') {
  2.         $keys = array();
  3.         $values = array();
  4.         if (empty($to) && is_array($from)) {
  5.                 $keys_temp = array_keys($from);
  6.                 $values_temp = array_values($from);
  7.                 $fr_str=""; $to_str="";
  8.                 for($i=0; $i<count($keys_temp); $i++)  
  9.                 {$fr_str.=$keys_temp[$i]; }
  10.                 for($i=0; $i<count($values_temp); $i++)  
  11.                 {$to_str.=$values_temp[$i]; }
  12.         } else {
  13.                 $fr_str=$from;
  14.                 $to_str=$to;
  15.         }
  16.                 preg_match_all('/./u', $fr_str, $keys);
  17.                 preg_match_all('/./u', $to_str, $values);
  18.                 $mapping = array_combine($keys, $values);
  19.                 return strtr($str, $mapping);
  20. }
Если же вам необходимо обрабатывать с помощью регулярного выражения каждую переданную односимольную строку отдельно - то можно использовать обработку переданного хеш-массива в цикле и передачу в регулярное выражение конкретной выбранной односимвольной строки из одного символа - а в качестве массива для замен использовать временный локальный массив содеражщий всегда только одино значение которое будет использоваться в array_push для основного массива

 

Powered by ExBB FM 1.0 RC1