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 回答