Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > проблема регистра, замена в строке


Автор: evya 23.9.2010, 19:27
Почему то не могу поменять:

Имею строку

Лена красива женщина пОШла домой

$poisk="пошла"
$poisk2="потопола"

$test=~s/$poisk/$poisk2/gi;


почему то не меняет изза регистра пОШла, хотя индефикатор i имеется

Автор: vadiml 24.9.2010, 00:02
Если не указать какая кодировка, то от модификатора /i есть прок только для латинских букв.

Поэтому если у Вас не utf8, то лучше не связываться с разными кодировками, а перед проверкой привести у одному регистру
$test = 'Лена красива женщина пОШла домой';
$test =~ tr/АБВГДЕЁ/абвгдеё/ и т.д. весь алфавит

Автор: admsasha 24.9.2010, 14:01
добавь
use locale;

Автор: evya 24.9.2010, 14:48
use locale; 
что нам даст???

Автор: admsasha 24.9.2010, 14:55
Цитата(evya @ 24.9.2010,  21:48)
use locale; 
что нам даст???

Даст использование текущей локали. Не работает ?

Автор: evya 24.9.2010, 15:23
нет не помогает решить задачу

причем mysql ищет нормально внезависимости от регистра
латинские символы хорошо проглатывает, а русские вообще не помогает


$test=~s/$poisk/$poisk2/gi;

Автор: admsasha 24.9.2010, 15:27
какая OS, какая локаль, в какой кодировке файл и текст в нем ?

Автор: evya 24.9.2010, 15:39
сервер UNIX

С сайта приходит через jquery в UTF я его перекодирую в 
from_to ($poisk, 'UTF-8', 'CP1251');

из mysql данные то же идут в ср1251

потом мне нужно подсветить искомое слово и вывести все данные

в этом и загвозка изза регистра слова поиск подстановка не работает


Автор: admsasha 24.9.2010, 15:42
прям unix ??

Серверная локаль какая ?

Добавлено @ 15:45
впрочем, скорее всего будет тогда так

Код

use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL,"ru_RU.cp1251");

Автор: evya 24.9.2010, 16:13
прям unix
Серверная локаль -  не пойму


Код

use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL,"ru_RU.cp1251");


то же не помогает


ты думаешь в разных кодировках сравнивается???
так вроде все в одной кодировке.

-i вообще для кирилицы работает???

$test=~s/$poisk/$poisk2/gi;


Автор: admsasha 24.9.2010, 16:32
Цитата(evya @  24.9.2010,  23:13 Найти цитируемый пост)
прям unix

Странно работать в unix с cp1251 smile

Цитата(evya @  24.9.2010,  23:13 Найти цитируемый пост)
-i вообще для кирилицы работает???

Естественно работает, только нужно правильно выстроить понимание кодировки для программы.

Цитата(evya @  24.9.2010,  23:13 Найти цитируемый пост)
ты думаешь в разных кодировках сравнивается???

Не сравнения в разных кодировках, а скрипт живет в другой кодировке, поэтому не может понять, какое соответствие регистров у данной. Как это я понимаю.

Цитата(evya @  24.9.2010,  23:13 Найти цитируемый пост)
так вроде все в одной кодировке.

текст - может быть.


P.S. Специально проверил на своем компьютере, установка "use locale" помогла решить проблему.

набери простой пример,  будет работать ?
Код

#!/usr/bin/perl
use locale;

$test="Лена красива женщина пОШла домой";
$poisk="пошла";
$poisk2="потопола";

$test=~s/$poisk/$poisk2/gi;

print $test;


у меня вывод
Код

Лена красива женщина потопола домой




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)