如何替换< (<)使用正则表达式在xml标签之间?

时间:2012-09-03 12:49:41

标签: php xml regex

我从数据库中获取xml数据作为字符串。     我想替换<在xml标签之间加上& lt; 。例如:

 <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标记中的内容或者还有其他方法吗?

2 个答案:

答案 0 :(得分: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>
  4. 同样,这远非完美,但如果你知道你期望哪个伪xml,你可能会以这种方式工作。当然,如果你的$ content中有:::sometext;;;这样的字符串,那么它将不起作用。

    标签也必须包含a-z0-9_-。

    当然,如果你能正确使用有效的xml会更好,但如果你这样做了,我想你没有问过这个问题。

答案 1 :(得分: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>