2012-09-03 90 views
1

我正在從數據庫中獲取一個xml數據作爲字符串。 我想取代<與& lt;在XML之間tags.For如:如何用正則表達式替換<(<)之間的xml標籤?

<smallelement> a<b </smallelement> 

待如果我使用字符串替換功能

$content = str_replace("<","&lt;",$content); 
it replaces element tag <smallelement> also like &lt ;smallelement. 

    &lt;smallelement> a&lt;b &lt;/smallelement> 

我怎樣才能做到這一點使用正則表達式替換替換爲

<smallelement> a &lt; b </smallelement> 

i want to replace < with &lt; 

xml標籤內容還是有其他方法嗎?

+2

首先分析XML,然後用(HTTP ['htmlentities']: //www.php.net/manual/en/function.htmlentities.php) – Leri

+6

' a '不是有效的XML;您應該使用已替換的實體來存儲XML,或者將這些內容用CDATA區域包含在內。 – feeela

+0

事情是我正在一個已經存在的結構中有上述格式的大量數據。因此我無法改變它。那麼還有其他方法可以實現嗎? – suganya

回答

2

好的,這不是一個完美的解決方案,但既然你已經有髒xml,我們可以嘗試一個骯髒的解決方案,對吧? ;)

$content = preg_replace('@<(/?)([a-z0-9_][a-z0-9_-]*)>@', ':::$1$2;;;', $content); 
$content = str_replace('<', '&lt;', $content); 
$content = preg_replace('@:::(/?)([a-z0-9_][a-z0-9_-]*);;;@', '<$1$2>', $content); 
  1. 替換所有<xmltags>:::tagnames;;;
  2. 所有剩餘<字符&lt;
  3. 更換更換所有:::tagnames;;;<xmltags>再次

再次,這是遠遠不夠完善,但如果你知道你期望得到哪個僞xml,你可以通過這種方式來處理它。當然,如果您的$內容中已有像:::sometext;;;這樣的字符串,它將無法工作。

此外,標籤必須僅包含a-z0-9_-。

當然,如果你可以使用有效的xml正確的方式會更好,但如果你這樣做,我想你沒有問過這個問題。

0

這裏是代碼

public static void main(String[] args) throws XPathExpressionException { 
     String str = "<smallelement> a<b </smallelement>";    
     String newstr = ""; 
     boolean flaQG = false; 
     boolean flaQL = false;  
     int lastIL = 0; 
     HashMap<Integer, String> al = new HashMap<Integer, String>(); 

     for(int i = 0; i < str.length(); i++) { 
      char c = str.charAt(i); 
      if(c == '<') {  
       flaQG = false; 
       if(!flaQL) { 
        flaQL = true; 
       }else { 
        al.put(lastIL, "<"); 
        flaQL=false; 
       }   
       lastIL = i; 
      }else if(c == '>') { 
       flaQL = false; 
       if(!flaQG) { 
        flaQG=true; 
       }else { 
        al.put(i, ">"); 
        flaQG = false; 
       }   
      } 
     } 

     Iterator it = null;  
     int j = 0; 
     boolean check = false; 
     //System.out.println("length "+str.length()); 
     final CharacterIterator cit = new StringCharacterIterator(str); 
     for(char c = cit.first(); c != CharacterIterator.DONE; c = cit.next()) { 
      it = al.entrySet().iterator(); 
      while (it.hasNext()) {    
       Map.Entry pairs = (Map.Entry)it.next(); 
       //System.out.println(pairs.getKey() + " = " + pairs.getValue()); 
       if((Integer)pairs.getKey() == j) { 
        check= true; 
        if(pairs.getValue().equals(">")) { 
         newstr += "&gt;"; 
        }else { 
         newstr += "&lt;"; 
        } 
       } 
      } 
      //System.out.println(c);  
      if(!check) { 
       newstr += c; 
      }else { 
       check = false; 
      } 
      j++; 
     } 
     System.out.println(newstr); 
    } 

注:上面的代碼不會工作,如果你的XML看起來像

<smallelement> a<b=b>c </smallelement> 
+0

我很抱歉,我沒有注意到你問的PHP解決方案,任何方式的邏輯是相同的,你應該能夠在PHP中實現上面的邏輯,我希望。 – Sark

相關問題