Выделение слов во Flash с использованием ActionScript 3.0

#flash #actionscript-3 #actionscript #flash-cs4

#flash #actionscript-3 #actionscript #flash-cs4

Вопрос:

Я создаю текстовый редактор с использованием Flash professional CS4 и actionscript 3.0

Это почти закончено, мне нужно только добавить функцию, которая выделяет некоторые «теги», такие как «[ИМЯ]» и «[ВОЗРАСТ]» (изменяя их цвет) всякий раз, когда они записываются.

Я использую текстовое поле, а не компонент TextArea.Это код, который я использую, но он работает не так, как планировалось.

 taMain.addEventListener(Event.CHANGE, checkTags);
function checkTags(e):void{
    var tempFormat:TextFormat = taMain.getTextFormat(taMain.selectionBeginIndex - 1, taMain.selectionEndIndex);
    var splitText:Array = taMain.text.split(" ");
    for (var i = 0; i < splitText.lenght; i  ) {
        switch (splitText[i]) {
            case "[NAME]":
                tempFormat.color = (0xff0000);
            break;
            case "[AGE]":
                tempFormat.color = (0x0000ff);
            break;
            default:
                tempFormat.color = (0x000000);
        }
        taMain.setTextFormat(tempFormat, taMain.text.indexOf(splitText[i]), taMain.text.indexOf(splitText[i])   splitText[i].length );
    }
}
  

Этот код работает только при первом использовании тега, но он не меняет цвет, если тег используется снова.

Есть идеи? какую-либо другую функцию я мог бы использовать?

Заранее спасибо.

Ответ №1:

taMain.text.indexOf(splitText[i]) всегда найдет первое вхождение слова, например, первое «[NAME]», и установит текстовый формат для этого первого вхождения, даже если цикл for выполняется для другого вхождения «[NAME]».

indexOf() принимает второй необязательный параметр, с которого начинается индекс, чтобы вы могли отслеживать, где в тексте вы находитесь в данный момент, выполнив что-то вроде этого:

 var tempFormat:TextFormat = taMain.getTextFormat(taMain.selectionBeginIndex - 1, taMain.selectionEndIndex);
var splitText:Array = taMain.text.split(" ");
var startIndex:Number = 0;
for (var i = 0; i < splitText.length; i  ) {
    switch (splitText[i]) {
        case "[NAME]":
            tempFormat.color = (0xff0000);
        break;
        case "[AGE]":
            tempFormat.color = (0x0000ff);
        break;
        default:
            tempFormat.color = (0x000000);
    }
    taMain.setTextFormat(tempFormat, taMain.text.indexOf(splitText[i], startIndex), taMain.text.indexOf(splitText[i], startIndex)   splitText[i].length );
    startIndex = taMain.text.indexOf(splitText[i], startIndex)   splitText[i].length;
}
  

Но я не думаю, что разделение по пробелу, как в var splitText:Array = taMain.text.split(" ") , является хорошим способом поиска слов в общем тексте. Что, если [ВОЗРАСТ] — это последнее слово строки, после которого стоит разрыв строки, или после [ИМЕНИ] стоит запятая, как в «Привет [ИМЯ], как дела»? В приведенном выше коде эти случаи были бы пропущены.

Комментарии:

1. startIndex работает!! но да, вы правы, я не рассматривал эти случаи. Есть хорошая идея о том, как найти конкретные слова? может быть, поиск посимвольно?

2. Используйте регулярные выражения. Отличный инструмент для его создания находится здесь: gskinner.com/RegExr Например, для поиска строки [AGE] используйте глобальный флаг, а регулярное выражение должно быть /[AGE]/g . Чтобы найти [ВОЗРАСТ] или [ИМЯ], используйте /[AGE]|[NAME]/g

Ответ №2:

С помощью регулярных выражений легко найти слово / фразу, если ваши входные данные находятся в диапазоне ASCII (например, без немецких умляутов). Затем вы можете инкапсулировать свой поисковый запрос в b примерно так:

 /bMyVarb/g 
  

Это будет соответствовать каждому вхождению MyVar , но только если это целое слово. MyVarToo например, не будет соответствовать, потому что b ссылается на границу слова.