PDA

Просмотр полной версии : RegExp и кириллица


lephik
23.03.2007, 08:47
прывет )
не для кого не секрет что флексовые String.replace, RegExp.exec глючат с кириллицей, корректно всё определяя но некорректно возвращая индексы встретившихся совпадений.
Есть ли народ который с этим успешно борется и как.
:bye:

etc
23.03.2007, 14:36
Да? Покажите пример.

lephik
26.03.2007, 08:52
public function someFunction( newMsg:String ) : void {
...
var str:String = "nor:)maltext ";
//var str:String = "кир:)иллица ";
str.replace(/:\)/ig,trackSmile);
...
}
private function trackSmile(matchedSubstring:String, index:int, str:String){
trace(index);
}

в случае с английским текстом index будет равен 3, в случае с кириллицей - 6.

etc
26.03.2007, 11:11
Возникла мысль написать аналог replace. Щас попробуем.

UPDATE:
Вот, что наэкспериментировалось корявое:

var a:String = 'test кири:(лл:(иц:)ы';
var replace:Function = function(str:String, pattern:RegExp, repl:Object):String {
var output:String = str;
var startIndex:uint = 0;
var addIndex:uint = 0;
var arrIndex:uint = 0;
var arr:Array = str.match(pattern);

var matchedString:String;
var result:String;
var index:uint;
var slices:Array = new Array();
var slice:String = str.substr(startIndex);
var searchIndex:uint = str.substr(startIndex).search(pattern);

if (typeof repl == 'function') {
if (searchIndex!=-1) {
slices.push(slice.substr(0,searchIndex));
} else {
slices.push(slice);
}
while (searchIndex!=-1) {
matchedString = arr[arrIndex];
index = startIndex+searchIndex;
result = repl(matchedString, startIndex+searchIndex, str);
addIndex = matchedString.length;
startIndex = index+addIndex;
slice = str.substr(startIndex);
searchIndex = str.substr(startIndex).search(pattern);
slices[arrIndex]+=result;
if (searchIndex!=-1) {
slices.push(slice.substr(0,searchIndex));
} else {
slices.push(slice);
}
arrIndex++;
if (!pattern.global) break;
}
return slices.join('');
} else {
return str.replace(pattern,repl);;
}
}
var f:Function = function(matchedString:String, index:uint, str:String):String {
trace(matchedString, index, str);
return '[:)]';
}
trace(replace(a, /:[\(\)]/ig,f));

Не проверялось на более сложных регэкспах. А аналог exec мне писать лень :D

Kikasso
26.03.2007, 12:01
в случае с английским текстом index будет равен 3, в случае с кириллицей - 6.
А это случайно не одно и то же, только с конца строки?

etc
26.03.2007, 12:08
Нет, дело в том, что там где-то внутри представление строки идет в два байта на кириллический символ. Похоже на баг.
Я написал об этом в адоб.

vooparker
26.03.2007, 13:12
Да знает Адоби об этом, это старый глюк, тока видимо делать с этим пока ничего не желают =(

etc
26.03.2007, 13:14
Ну, кому нужно replace, могут заюзать мой вариант :D
exec тоже можно поправить.

ir73
27.03.2007, 13:55
Нет, дело в том, что там где-то внутри представление строки идет в два байта на кириллический символ. Похоже на баг.
Я написал об этом в адоб.
в русской конфе ruFlex это обсуждалось, если не ошибаюсь, месяца 4 назад. В 2.0.1 вроде как должно было быть пофиксено

etc
27.03.2007, 14:23
Да? Каким образом это могло быть пофиксено, если этим занимается плеер?
Надо посмотреть, что там понаисправляли в плеерах, а не в самом Flex…

UPD: Пофиксено вроде бы в 9.0.28.0:

RegExp .index property isn't double byte aware. (186337)


UPD2: Пофиксили только exec, а replace забыли. Пипец.

ir73
27.03.2007, 15:42
Да? Каким образом это могло быть пофиксено, если этим занимается плеер?
Надо посмотреть, что там понаисправляли в плеерах, а не в самом Flex…

точно, пардон : )