我从数据库中获取xml数据作为字符串。 我想替换<在xml标签之间加上& lt; 。例如:
<smallelement> a<b </smallelement>
替换为
<smallelement> a < b </smallelement>
i want to replace < with <
如果我使用字符串替换功能
$content = str_replace("<","<",$content);
it replaces element tag <smallelement> also like < ;smallelement.
<smallelement> a<b </smallelement>
如何使用正则表达式替换xml标记中的内容或者还有其他方法吗?
答案 0 :(得分:2)
好的,这不是一个完美的解决方案,但由于你已经有了脏xml,我们可以尝试一个肮脏的解决方案,对吧? ;)
$content = preg_replace('@<(/?)([a-z0-9_][a-z0-9_-]*)>@', ':::$1$2;;;', $content);
$content = str_replace('<', '<', $content);
$content = preg_replace('@:::(/?)([a-z0-9_][a-z0-9_-]*);;;@', '<$1$2>', $content);
<xmltags>
替换为:::tagnames;;;
<
字符替换为<
:::tagnames;;;
替换为<xmltags>
同样,这远非完美,但如果你知道你期望哪个伪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 += ">";
}else {
newstr += "<";
}
}
}
//System.out.println(c);
if(!check) {
newstr += c;
}else {
check = false;
}
j++;
}
System.out.println(newstr);
}
注意:如果您的xml看起来像
,上面的代码将不起作用 <smallelement> a<b=b>c </smallelement>