1

データベースから xml データを文字列として取得しています。< を < ; に置き換えたい xml タグの間。

 <smallelement> a<b </smallelement>

として置き換えます。

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

i want to replace < with &lt; 

文字列置換機能を使用する場合

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

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

正規表現を使用してxmlタグ内のコンテンツを置き換えるにはどうすればよいですか、それとも他の方法がありますか?

4

2 に答える 2

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;;;、 $content のような文字列がすでにある場合は機能しません。

また、タグには a-z0-9_- のみを含める必要があります。

もちろん、有効な xml を正しく使用できればもっとよいのですが、そうであれば、この質問をしていなかったと思います。

于 2012-09-03T13:37:35.717 に答える
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>
于 2012-09-04T05:05:24.503 に答える