【问题标题】:How to replace < (&lt;) inbetween xml tags using regular expression?如何使用正则表达式替换 xml 标签之间的 < (<)?
【发布时间】:2012-08-28 05:07:37
【问题描述】:

我正在从数据库中获取一个 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 标签中的内容或有其他方法来实现这一点?

【问题讨论】:

  • 先解析你的xml,然后使用htmlentities.
  • &lt;smallelement&gt; a&lt;b &lt;/smallelement&gt; 不是有效的 XML;您应该使用已替换的实体来存储 XML,或者将这些内容用 CDATA 区域括起来。
  • 问题是我正在研究一个已经存在的结构,该结构具有上述格式的大量数据。因此我无法改变它。那么有没有其他方法可以实现呢?
  • 您正在处理的数据充其量是模棱两可的。范围总是在smallelement 的开始/结束标记之间,还是在任何开始/结束标记对之间?除了&lt;,你还需要处理什么吗?您是否必须处理嵌套标签序列,例如&lt;xx&gt; a &lt; b &lt;yyy&gt; ddd &lt;/yyy&gt; &lt;/xxx&gt;?如果它受到严格限制,您也许可以应付——但首先让数据库存储格式错误的伪 XML 是可笑的。
  • 也许这个答案也有帮助:stackoverflow.com/a/2287467/1059457

标签: php xml regex


【解决方案1】:

好吧,这不是一个完美的解决方案,但是既然你已经有了脏 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. 将所有&lt;xmltags&gt; 替换为:::tagnames;;;
  2. &amp;lt; 替换所有剩余的&lt; 字符
  3. 再次将所有:::tagnames;;; 替换为&lt;xmltags&gt;

同样,这远非完美,但如果你知道你必须期待哪个伪 xml,你也许可以用这种方式处理它。当然,如果您的 $content 中已经有 :::sometext;;; 之类的字符串,则它不会起作用。

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

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

【讨论】:

    【解决方案2】:

    这里是代码

    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>
    

    【讨论】:

    • 对不起,我没有注意到你要求php解决方案,无论如何逻辑都是一样的,你应该能够在php中实现上述逻辑,我希望。
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多