2013-08-27 26 views
2

有隻處理XML作爲字符串轉義XML標籤內容中的XML特殊字符的方式是否可以使用正則表達式完成?(正則表達式) 嘗試,因爲它包含了一些標籤裏面的「<」字來創建新的XML()從字符串時,我得到異常的XML的運行時錯誤的ActionScript/flex3:轉義XML特殊字符,如<, >「和」內/標籤內容中

+0

你試過用CDATA嗎?http://www.w3schools.com/xml/xml_cdata.asp – divillysausages

+0

@ [divillysausages](http://stackoverflow.com/users/639441/divillysausages):答案是針對客戶端代碼(修復),以防您無權訪問修改服務器代碼/不想修改服務器代碼。 – OviC

回答

2

您可以使用這樣的事情:

public static function escapeXMLTagContents(a_string:String):String{ 
     var l_indexOfSpecialChar:int = -1, 
      l_tagsMatch:RegExp =/<(\?|[a-zA-Z_]{1}|\/{1})[^<]*?>/g, 
      l_tags:Array = [], 
      l_tagCharacterIndexes:Array = [], 
      l_stringCopy:String = new String(a_string), 
      i:int = -1, 
      l_replaceArray:Array = [], 
      l_return:String = "", 
      l_tagCharIndex:int = -1, 
      l_replaceChar:String = ""; 

     l_replaceArray.push("&|&amp;"); 
     l_replaceArray.push("<|&lt;"); 
     l_replaceArray.push(">|&gt;"); 
     l_replaceArray.push("\"|&quot;"); 
     l_replaceArray.push("'|&apos;"); 

     l_tags = a_string.match(l_tagsMatch); 
     i = l_tags.length; 
     while (--i > -1){ 
      var l_tagText:String = l_tags[i]; 
      var l_startIndex:int = l_stringCopy.lastIndexOf(l_tagText); 
      var l_endIndex:int = l_startIndex + (l_tagText.length - 1); 

      for (var j:int = l_startIndex; j <= l_endIndex; j++){ 
       if(l_tagCharacterIndexes.indexOf(j) < 0){ 
        l_tagCharacterIndexes.push(j); 
       } 
      } 

      l_stringCopy = l_stringCopy.substring(0, l_startIndex); 
     } 

     l_return = new String(a_string); 
     for each (l_replaceChar in l_replaceArray){ 
      l_stringCopy = new String(l_return); 
      while ((l_indexOfSpecialChar = l_stringCopy.lastIndexOf(l_replaceChar.charAt(0))) > -1) { 
       // determine if it char needs to be escaped (i.e is inside tag contents) 
       if(l_tagCharacterIndexes.indexOf(l_indexOfSpecialChar) == -1){ 
        l_return = l_return.substring(0, l_indexOfSpecialChar) + l_replaceChar.split("|")[1] + l_return.substring(l_indexOfSpecialChar+1); 

        // adjust indexes 
        for (i = 0; i < l_tagCharacterIndexes.length; i++) { 
         l_tagCharIndex = l_tagCharacterIndexes[i]; 
         if(l_tagCharIndex >= l_indexOfSpecialChar) { 
          l_tagCharacterIndexes[i] = l_tagCharacterIndexes[i] + String(l_replaceChar.split("|")[1]).length-1; // -1 from the old characther "&,<,>," or '" 
         } 
        } 
       } 

       l_stringCopy = l_stringCopy.substring(0, l_indexOfSpecialChar); 
      } 
     } 

     return l_return; 
    }