使用正则表达式关闭打开的 XML 标记

Posted

技术标签:

【中文标题】使用正则表达式关闭打开的 XML 标记【英文标题】:Closing open XML tags with regex 【发布时间】:2011-03-29 00:06:30 【问题描述】:

基本上,我想和here 做同样的事情,这是在 Python 中完成的。 我想将所有自闭元素替换为长语法。

例子

    <iframe src="http://example.com/thing"/>

变成

    <iframe src="http://example.com/thing"></iframe>

完整示例:

 <html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <link rel="stylesheet" type="text/css" href="/sample.css">
  <title></title>
  <script type="text/javascript" src="/swfobject.js">
                //void
          </script>
  <script type="text/javascript" language="JavaScript" src="/generate.js">
//void
  </script>
  <script type="text/javascript" language="JavaScript" src="/prototype.js">
//void
  </script>
</head>
<body id="mediaPlayer" style="margin:0;padding:0;">
<script type="text/javascript">
                                swfobject.registerObject('id_G12564763');       


                function getFlashObject() 
                        var object;
                        if (navigator.appName == 'Microsoft Internet Explorer' || navigator.userAgent.indexOf("Chrome")!=-1)
                        
                                object = document.getElementById('id_G12564763');
                         
                        else 
                        
                                object = document['flash_id_G12564763'];
                        
                        return object;
                

        </script>
</body>
</html>

【问题讨论】:

请注意,***.com/questions/1732348/… 描述了此操作的逆操作。 Borealid,我知道这一点。你知道如何用解析器解决这个问题吗?据我所知,在使用解析器解析之前,XML 必须格式正确。这正是我需要做的。我尝试过 Tidy,但没有奏效,该项目不再维护。这是一个小的 html 输出,将简单地包含一系列 javascript 包含和对象嵌入标记 (flash)。 【参考方案1】:

这可以用来替换一个标签(javascript中的代码)。

var becomes = "<iframe src='http://example.com/thing'/>".replace(/<(\w*) (.*)\//,'<$1 $2></$1')

同样的,在 Java 中。

String becomes = "<iframe src=\"http://example.com/thing\"/>".replaceFirst("<(\\w*) (.*)\\/", "<$1 $2></$1");

【讨论】:

【参考方案2】:

好的,伙计们。我找到了解决方法。我将输出方法连接到该 html 来自的 xml,XSLT 引擎负责为我关闭那些打开的标签。感谢您的回答,但是如果您碰巧有解决问题的方法,请留下您的答案,我会将其标记为答案。这可能对其他人有用。

【讨论】:

【参考方案3】:
String resultHtml = inputHtml.replaceAll("(?six)<(\\w+)([^<]*?)/>", "<$1$2></$1>");

这将正确处理未终止的标签,例如 &lt;hr&gt;&lt;img&gt;

【讨论】:

Hmm .. 似乎对我有用,尽管您的示例没有与我提供的正则表达式匹配(即,它没有自封闭元素)。我调整了修饰符以更正确地处理多行输入 - 这可能会有所帮助...

以上是关于使用正则表达式关闭打开的 XML 标记的主要内容,如果未能解决你的问题,请参考以下文章

有效 XML 标记名称的 PHP 正则表达式

用于删除 XML 标记及其内容的正则表达式

正则表达式在任何 xml 标记中添加属性

在 Python 中使用正则表达式从特定 xml 标记中提取特定值 [重复]

跨越多个 XML 标记的字符串匹配索引的正则表达式

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#