#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
ссылается на границу слова.