Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Изменение регистра
 
 автор: max90   (22.12.2011 в 00:25)   письмо автору
 
 

Здравствуйте. Такой пример: Россия - программа надо изменить на Россия - Программа.
Делаю так, но не изменяется регистр
        $name = preg_replace("/( - .{1})/", strtoupper("\$1"), $name);

  Ответить  
 
 автор: Lotanaen   (22.12.2011 в 09:45)   письмо автору
 
   для: max90   (22.12.2011 в 00:25)
 

ucwords();

  Ответить  
 
 автор: max90   (22.12.2011 в 11:16)   письмо автору
 
   для: Lotanaen   (22.12.2011 в 09:45)
 

Без изменений. Почему-то функция в регулярке не проходит.

  Ответить  
 
 автор: Slo_Nik   (22.12.2011 в 11:32)   письмо автору
 
   для: max90   (22.12.2011 в 11:16)
 

уберите вообще регулярку
и сделайте так

<?php 
$str 
"Россия - программа";
echo 
ucwords(strtolower($str)); // Россия - Программа
?>

  Ответить  
 
 автор: max90   (22.12.2011 в 12:34)   письмо автору
 
   для: Slo_Nik   (22.12.2011 в 11:32)
 

Не подойдет, нужно чтобы изменился регистр только первой буквы после дефиса. А у меня после дефиса и 2 и более слов.

  Ответить  
 
 автор: Sfinks   (22.12.2011 в 13:57)   письмо автору
 
   для: max90   (22.12.2011 в 00:25)
 

Скорей всего проблемы на хостинге с локалью. Сталкивался. Попробуйте перед вызовом preg_replace установить
setlocale(LC_CTYPE,"Russian_Russia.1251")
или, если у вас utf-8, то используйте mb_strtoupper, а в preg_replace - "/( - .{1})/u"

  Ответить  
 
 автор: max90   (22.12.2011 в 15:33)   письмо автору
 
   для: Sfinks   (22.12.2011 в 13:57)
 

Кодировка ср1251. На всякий случай сделал, что Вы советовали, не помогает.
ЗЫ. тестирую на денвере.

  Ответить  
 
 автор: Slo_Nik   (22.12.2011 в 16:32)   письмо автору
 
   для: max90   (22.12.2011 в 15:33)
 

тоже пробовал решить проблему, но толком ни чего не получилось.
вернее результат есть, но криво это пока работает.

<?php 
$str 
"Россия - программа";
$pattern '|[.\s]+([а-я])|';
preg_match($pattern$str$out ); 
print_r($out);// выход Array ( [0] => п [1] => п )
echo "<br />";
// применение того же РВ, но положительный результат только при windows-1251
echo preg_replace_callback($patterncreate_function('$matches''return strtoupper($matches[1]);'), $str); // выход Россия -Программа
?>

Если файл будет в кодировке "utf-8", будет установлен модификатор "u", то результат для меня странный на выходе, почему - не могу понять

<?php 
$str 
"Россия - программа";
$pattern '|[.\s]+([а-я])|u';
preg_match($pattern$str$out );
print_r($out); // выход Array ( [0] => п [1] => п )
echo "<br />";
echo 
preg_replace_callback($patterncreate_function('$matches''return strtoupper($matches[1]);'), $str); // выход Россия - Ярограмма )))
?>

если во втором варианте использовать mb_strtoupper(), то вообще ни чего не работает...

  Ответить  
 
 автор: Sfinks   (22.12.2011 в 23:08)   письмо автору
 
   для: max90   (22.12.2011 в 15:33)
 

А на win1251 попробовали mb_strtoupper() ?
Я тут отыскал функцию которую юзал вместо strtuupper() 4 года назад с теми же проблемами и у меня работало.
<?
  
function lowercase($str) {
    
$str mb_strtolower($str);
    return 
str_replace(array("Ё","Ч","Я"),array("ё","ч","я"),$str);
  }
?>

  Ответить  
 
 автор: Sfinks   (22.12.2011 в 23:09)   письмо автору
 
   для: max90   (22.12.2011 в 15:33)
 

PS. Ну естессно lower надо на upper поменять

  Ответить  
 
 автор: max90   (22.12.2011 в 23:54)   письмо автору
 
   для: Sfinks   (22.12.2011 в 23:09)
 

Slo_Nik, с двумя словами не работает
Sfinks, переводит все буквы в верхний регистр.
Подумал тут, попытаюсь отсечь часть строки до дефиса, а остальную поместить в массив и менять первое значение массива.

  Ответить  
 
 автор: Slo_Nik   (22.12.2011 в 23:57)   письмо автору
 
   для: max90   (22.12.2011 в 23:54)
 

> с двумя словами не работает
мне надо было дописать, что "можно начать отталкиваться от такого то варианта".... )))
и работает только с windows-1251.

  Ответить  
 
 автор: max90   (23.12.2011 в 00:06)   письмо автору
 
   для: Slo_Nik   (22.12.2011 в 23:57)
 

Благодаря Вам догадался использовать массивы ;)
Путем нескольких извращений сделал рабочий вариант ))
        $name1 = preg_replace("/.* - /", '', $name);
        $dotire = preg_replace("/ - .*/", '', $name);
        
        $explode_name = explode( ' ', $name1 );
        $explode_name[0] = ucfirst($explode_name[0]);
        $implode_name = implode(" ", $explode_name);
    
        echo $dotire ." - ".$implode_name;

  Ответить  
 
 автор: Slo_Nik   (23.12.2011 в 01:10)   письмо автору
 
   для: max90   (23.12.2011 в 00:06)
 

дело в том, что интересней сделать без нескольких извращений, а одним.
я пытался сделать это основываясь на информации с сайта preg_replace_callback(), но ....
по свободе надо будет разобраться с этим вопросом )))

  Ответить  
 
 автор: Sfinks   (23.12.2011 в 15:58)   письмо автору
 
   для: max90   (22.12.2011 в 23:54)
 

> Sfinks, переводит все буквы в верхний регистр.
Ессно все. Ее нужно было в ваш начальный вариант подставить вместо стртуаппер. Примерно так:
<?
  
function uppercase($str) { 
    
$str mb_strtoupper($str); 
    return 
str_replace(array("Ё","Ч","Я"),array("ё","ч","я"),$str); 
  }

  
$name preg_replace("/( - .{1})/"uppercase("\$1"), $name);
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования