Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как реализовать замену подстроки в строке? (http://www.flasher.ru/forum/showthread.php?t=104862)

iNils 07.12.2007 13:49

Цитата:

Сообщение от Revolter
проблема в том что "Пример" может быть "ПриМеР", т.е. не известно где и сколько там будет заглавных букв. как тогда решить эту задачу?

Я же сказал, сначала идете по "м", потом по "М".

wvxvw 07.12.2007 16:00

Зачем сохранять регистр, если подстроки все равно будут удалены?
Автор, обьясни пожалуйста, почему String.toLowerCase() не устраивает?

Вот, наваял заодно что-то... ток зачем это нужно - не пойму %)
Код:

var search_str:String = "abcd";
var replace_str:String = "efgh";
var searched_str:String = "abcd, Abcd, abCD, dcba";
function strConvert(s_str:String, r_str:String, rp_str:String):String {
        var i:Number = 0;
        var rp_arr:Array = rp_str.split("");
        while (i<s_str.length) {
                var check_sum:String = "";
                var mtx:Array = [];
                while (s_str.charAt(i).toLowerCase() == r_str.charAt(0) || check_sum!="") {
                        check_sum += s_str.charAt(i);
                        if (s_str.charAt(i).toLowerCase() != s_str.charAt(i)) {
                                mtx.push(true);
                        } else {
                                mtx.push(false);
                        }
                        i++;
                        if(i>s_str.length)break;
                        if (check_sum.length == r_str.length) {
                                var j:Number = 0;
                                var sb_str:String = "";
                                while (j<rp_arr.length) {
                                        mtx[j] ? sb_str += rp_arr[j].toUpperCase() : sb_str += rp_arr[j];
                                        j++;
                                }
                                s_str = s_str.slice(0, i-r_str.length)+sb_str+s_str.slice(i, s_str.length);
                                mtx=[];
                                check_sum ="";
                        }
                }
                i++;
        }
        return s_str;
}
trace(strConvert(searched_str, search_str, replace_str));


iNils 07.12.2007 16:09

Потому, что toLowerCase() заменит все символы в строке. А двойной проход будет работать быстрее, чем сложный код выше.

wvxvw 07.12.2007 16:36

Я просто все равно не совсем понимаю, какого результата желает автор...
Пример: "Василий ПупкиН утоп."
меняем совпадения "пупкин" на "ло".
результат: "Василий Ло утоп". (от того, что последняя буква в фамилии была заглавной ничего не изменилось...
или так: "Все страны бывшего СССР пережили экономический кризис".
меняем "ссср" на "Советского Союза".
получаем: "Все страны бывшего СОВЕтского союза пережили экономический кризис".

Revolter 07.12.2007 17:46

Цитата:

Сообщение от wvxvw
Я просто все равно не совсем понимаю, какого результата желает автор...
Пример: "Василий ПупкиН утоп."
меняем совпадения "пупкин" на "ло".
результат: "Василий Ло утоп". (от того, что последняя буква в фамилии была заглавной ничего не изменилось...
или так: "Все страны бывшего СССР пережили экономический кризис".
меняем "ссср" на "Советского Союза".
получаем: "Все страны бывшего СОВЕтского союза пережили экономический кризис".

У меня реализован поиск - сообщается сколько искомых строк найдено в файлах поиска. Далее юзер выбирает какой файл просмотреть. Файл загружается в TextField с включенным html. Искомое слово выделяется цветом - <font color="#0000FF">искомое слово</font>. Проблема в том, чтобы сделать эту замену нечувствительной к регистру. То есть чтобы "ИсКОмОе СЛоВо" менял на "<font color="#0000FF">ИсКОмОе СЛоВо</font>" и т.п.

сделал (allT - текст где надо выделить search_str):
Код:

function mark(allT:String;search_str:String){
        lenT = length(allT);
        allTemp = allT.toLowerCase();
        searchTemp = search_str.toLowerCase();
        slen = length(search_str);
        num = 0; // с какой позиции искать
        n = 0; // кол-во найденых
        index = allTemp.indexOf(searchTemp, num); // индекс текущего вхождения
        while (index>=0) {
                allT = allT.substr(0,index + n*29) + '<font color="#0000FF">' + allT.substr(index+n*29,slen) + '</font>' + allT.substr(index+slen+n*29 ,length(allT));
                n++;
                num = index+slen;
                index = allTemp.indexOf(searchTemp, num); // индекс текущего вхождения
        };
        return allT
};


wvxvw 07.12.2007 21:37

Код:

var given_str:String = "<font color='#008080'>Hier kommt die Sonne, Hier kommt die Sonne. Rammstein (c)</font>";
var search_str:String = "sOnNe";
var _txt:TextField = _root.createTextField("_txt",0,0,0,200,200);
_txt.border = true;
_txt.multiline = true;
_txt.wordWrap = true;
_txt.html = true;
_txt.htmlText = given_str;
function searchAndReplace(s_str:String, r_str:String):String {
        r_str = r_str.toLowerCase();
        var n:Number = 0;
        var i:Number = 0;
        var j:Number = 0;
        while(i<s_str.length){
                if(s_str.charAt(i).toLowerCase()==r_str.charAt(0) || n!=0){
                        trace("found at "+i+" | "+s_str.charAt(i));
                        if (s_str.charAt(i).toLowerCase() == r_str.charAt(j)){
                                trace("processing "+s_str.charAt(i).toLowerCase());
                                n++;
                                j++;
                        } else {
                                n=0;
                        }
                        if(n == r_str.length){
                                s_str = s_str.slice(0,i-r_str.length)+"<font color='#800000'>"+s_str.slice(i-r_str.length,i+1)+"</font>"+s_str.slice(i+1,s_str.length);
                                i+=29+n;
                                n=0;
                                j=0;
                        }
                }
                i++;
        }
        return s_str;
}
_txt.htmlText = searchAndReplace(given_str,search_str);

Ну, как вариант

CorC 10.12.2007 10:12

Цитата:

Сообщение от Revolter
не подходит - важно сохранить регистр букв

Я не заставляю вас менять регистр в исходной строке, можно же создать дубликат этой строки. По ней уже поискать.


Часовой пояс GMT +4, время: 08:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.