我正在使用Flash专业版CS4和actionscript 3.0
制作文本编辑器它已接近完成,我只需添加一个功能,可以在写入时突出显示某些“标签”,如“[NAME]”和“[AGE]”(通过更改其颜色)。
我正在使用textField,而不是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 );
}
}
此代码仅在第一次使用标记时起作用,但如果再次使用标记,则不会更改颜色。
有什么想法吗?我可以使用的任何其他功能吗?
提前致谢。
答案 0 :(得分:0)
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(" ")
中分割空间是一种在一般文本中查找单词的好方法。如果[AGE]是一行的最后一个单词,后面有一个换行符,或者[NAME]后面有一个逗号,如“你好[NAME],你好吗”怎么办?上面的代码会遗漏这些事件。
答案 1 :(得分:0)
使用正则表达式,如果您的输入在ASCII范围内(例如没有德语变音符号),则很容易找到单词/短语。然后,您可以将搜索词封装在\ b中,如下所示:
/\bMyVar\b/g
这将匹配MyVar
的每一次出现,但仅限于整个单词。例如,MyVarToo
不匹配,因为\b
指的是单词边界。