Просмотр полной версии : Поиск и замена слова
Помогите, пожалуйста, решить такую проблему.
В текстовом поле нахожу слово и заменяю его. Но меняется также и часть другого слова, которое содержит в себе искомое. Как мне определить, что длина слова "круглый" не равна длине "круг" и поэтому замену в этом слове производить не нужно?
much = 0;
t.text = "круг, круглый мяч";
arr = new Array("круг");
function changemain() {
for (i=0; i<=t.text.length; i++) {
var bin = t.text.indexOf(arr[0], much);
var bon = bin+arr[0].length;
much = bon;
t.replaceText(bin, bon, "квадрат");
much = 0;
}
}
changemain();
caseyryan
27.06.2014, 07:41
С помощью регулярных выражений.
Вот тут (www.jurjans.lv/flash/RegExp.html)чувак писал класс RegExp для AS2
Правда для русских букв его придется проапгрейдить, так как он рассчитан только на латиницу
Вот. Не слишком элегантно, но отладил и работает.
// Набор НЕбукв (включая пробел)
var delimiters:Array = ",._ -+?(){}[]".split("")
// Хэш-объект для проверки на принадлежность символа к разделителям без перебора
// ВСЕХ описанных разделителей
var delHash:Object = new Object()
// Формируем хэш-объект
for ( var i=0; i<delimiters.length; i++ ) delHash[ delimiters[i] ] = true
// Проверка символа на принадлежность к разделителям
function charIsDelimiter( char ){
if ( delHash[char] == true ) return false; else return true;
}
function searchAndReplace( src, from, to ){
trace( "\n SOURCE STRING:"+src )
var idx
var pos = 0
do
{
idx = src.indexOf( from, pos )
if ( idx >=0 ){
pos = idx+from.length
var leftChar = false
var rightChar = false
// Проверяем крайние символы слова на разделители, если их индексы
// лежат в диапазоне граничных индексов строки
if ( idx !=0 ) leftChar = charIsDelimiter( src.charAt( idx-1 ) )
if ( idx+from.length != src.length ) rightChar = charIsDelimiter( src.charAt( idx+from.length ) )
if ( !leftChar && !rightChar ) src = src.substr(0,idx)+to+src.substr(idx+from.length, src.length)
}
}
while ( idx!=-1 )
// Продолжаем поиск по строке, пока искомая сигнатура в ней не перестанет находиться
trace( "RESAULT STRING:"+src )
}
var sourceText = "круг, круглый, __круг___кругляшок, округлый, (круг";
searchAndReplace( sourceText, "круг","квадрат" )
SOURCE STRING:круг, круглый, __круг___кругляшок, округлый, (круг
RESAULT STRING:квадрат, круглый, __квадрат___кругляшок, округлый, (квадрат
Спасибо за ответы!
Вот тут (www.jurjans.lv/flash/RegExp.html)чувак писал класс RegExp для AS2
я новичок, не осилю, мне бы в примере dark256 разобраться)
Не надо разбираться - бери да юзай. :)
Не надо разбираться - бери да юзай. :)
Легко сказать) стоит поменять условия и у меня уже возникают проблемы.
Так работает.
arr = new Array(['круг', ['квадрат']],['овал',['треугольник']]);
searchAndReplace(sourceText, arr[0][0], arr[0][1]);
А так почему-то нет.
arr = new Array(['круг', ['квадрат']],['овал',['треугольник']]);
for (j=0; j<=sourceText.length; j++) {
searchAndReplace(sourceText, arr[j][0], arr[j][1]);
}
dark256, еще раз спасибо, вроде разобрался:
var sourceText = "круг, круглый, __круг___кругляшок. округлый, (круг, овал овальный, полумесяц сфера, цилиндр цилиндрический, тор";
arr = new Array(['круг','овал','полумесяц'], ['сфера','цилиндр','тор']);
arrz = new Array(['квадрат','треугольник','прямоугольник'], ['пирамида','конус','параллепипед']);
var delimiters:Array = ",._ -+?(){}[]".split("");
var delHash:Object = new Object();
for (var i = 0; i<delimiters.length; i++) {
delHash[delimiters[i]] = true;
}
function charIsDelimiter(char) {
if (delHash[char] == true) {
return false;
} else {
return true;
}
}
function searchAndReplace() {
trace("\n SOURCE STRING:"+sourceText);
var idx;
var pos = 0;
for (i=0; i<=sourceText.length; i++) {
for (j=0; j<=sourceText.length; j++) {
do {
idx = sourceText.indexOf(arr[i][j], pos);
var r:Number = Math.floor(Math.random()*arrz[i].length);
if (idx>=0) {
pos = idx+arr[i][j].length;
var leftChar = false;
var rightChar = false;
if (idx != 0) {
leftChar = charIsDelimiter(sourceText.charAt(idx-1));
}
if (idx+arr[i][j].length != sourceText.length) {
rightChar = charIsDelimiter(sourceText.charAt(idx+arr[i][j].length));
}
if (!leftChar && !rightChar) {
sourceText = sourceText.substr(0, idx)+arrz[i][r]+sourceText.substr(idx+arr[i][j].length, sourceText.length);
}
}
} while (idx != -1);
}
}
trace("RESAULT STRING:"+sourceText);
}
searchAndReplace();
Добавлено через 64 часа 46 минут
Не получается( При перестановке в массиве, слово (например, "круг") не ищет.
Исходный массив:
arr = new Array(['овал', 'круг' ,'полумесяц'], ['сфера','цилиндр','тор']);
Ни так:
arr = new Array(['овал', 'круг' ,'полумесяц'], ['сфера','цилиндр','тор']);
Ни так:
arr = new Array(['овал','полумесяц'], ['сфера','цилиндр','тор'],['круг']);
Я, к сожалению, не могу до сих пор понять смысла подобных входных данных.......
Посомтреть код смогу только ближе к вечеру.
Пока опишите суть и смысл подобных массиово на входе...
arr = new Array(['круг','овал' ,'полумесяц'], ['сфера','цилиндр','тор']);
Смысл такой.
Найти в тексте все слова из arr[0] (это будут схожие по смыслу слова) и заменить их на рандомное слово из arrz[0], затем из arr[1] на arrz[1] и т.д.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.