2014-04-08 111 views
0

我試圖在TLF中插入一個鏈接。通常你只會簡單地使用正則表達式跨越多個XML標籤的字符串匹配索引

var linkElement:LinkElement = textArea.textFlow.interactionManager.applyLink(...); 

的問題是,如果我創建它地跨不同格式的文本(粗體,斜體等),或天堂跨越段落和列表項禁止,它完全徹底的鏈接碰撞和灼傷。鏈接格式完全丟失,列表結構崩潰。

只要通過addChild()添加LinkElement也不起作用,如果我們要在選定的文本中保留格式和結構。

利用interactionManager.cutTextScrap(...)將選擇的textFlow取出,用interactionManager.applyLink(...)將其包裝在LinkElement中,然後「粘貼」回來...也會產生一個混亂。

所以我必須創建自己的鏈接插入例程。

什麼我決心要做的是:

1)轉換文本流標記爲一個字符串

2)查找文本流串

內選擇的起點和終點指標3)中的起始索引在插入以下字符串:

</span><a href="[hrefVar]" target="[targetVar]"><span> 

4)插入結束索引處的以下字符串:

</span></a><span> 

5)重新轉換文本流串到TextFlow對象爲文本區域

瞧!即時RTF鏈接!

唯一的問題是......我不知道如何寫一個正則表達式解析方程,可以找到XML標記內的一個字符串匹配,其中結果可能跨越幾個標籤傳播的開始和結束索引。

例如,如果是TextFlow爲(略):

<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span> 
lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit. 
</span></p></TextFlow> 

說,例如,用戶已經選擇了「悲存有坐阿梅特」被轉換成一個鏈接。我需要找到的第一個和最後一個索引「存有悲坐阿梅德」該RTF標記中,然後插入)於3所示琴絃& 4),從而使最終的結果看起來是這樣的:

<TextFlow><p><span>Lorem </span><a href="http://www.google.ca" target="_blank"> 
<span>Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span> 
<span fontStyle="italic">et</span></a><span>, consectetur adipiscing elit. 
</span></p></TextFlow> 

可能失去了一些樣式格式,但我可以修復通過文本流格式化後解析。

我需要的是正則表達式來做第2步)。

我知道正則表達式忽略標籤並去掉標籤之間的文本,以及如何找到所選文本在剝離的文本流文本中的字符串匹配......但不知道如何在原始文件中找到匹配索引(未劃掉)textflow字符串。

有人嗎?

回答

0

恕我直言,更好的辦法是通過字符串,而不是嘗試去與正則表達式。 這是一個快速骯髒的方式的想法,這個代碼需要改進,但無論如何它可能會給出方向。 所以主要目標可能只是「丟棄」標籤和匹配文本,但是計數在過程中傳遞的許多字符。

//This code might need revision for not to get <and> symbols as fake tags starting and finishing points, also reseting searchwhen text not completly done. 

var sourceStr:String = '<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.</span></p></TextFlow>'; 
var searchStr:String = "Lorem Ipsum d"; 
var indexes:Object = firstLast(sourceStr, searchStr); 

trace(indexes.startIndex,indexes.finishIndex); 


function firstLast(sourceStr:String, searchStr:String):Object 
{ 
    var indexCounter:int = -1; 

    var searchFlag:Boolean = true; 
    var searchPos:int = 0; 

    var searchChar:String; 
    var sourceChar:String; 

    var startIndex:int; 
    var finishIndex:int; 

    for (var i:int = 0; i < sourceStr.length; i++) 
    { 
     indexCounter++; 


     sourceChar = sourceStr.substr(i, 1); 
     if (sourceChar == "<") 
     { 
      searchFlag = false; 

     } 
     else if (sourceChar == ">") 
     { 
      searchFlag = true; 
     } 

     if (!searchFlag) 
     { 
      continue; 
     } 

     searchChar = searchStr.substr(searchPos, 1);  
     if (sourceChar == searchChar) 
     { 
      if (searchPos == 0) 
      { 
       startIndex = indexCounter; 
      } 
      if (searchPos == searchStr.length - 1) 
      { 
       finishIndex = indexCounter; 
      } 
      searchPos++; 
     } 


    } 

    return { startIndex:startIndex, finishIndex:finishIndex }; 

}