使用正则表达式关闭打开的 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>");
这将正确处理未终止的标签,例如 <hr>
和 <img>
【讨论】:
Hmm .. 似乎对我有用,尽管您的示例没有与我提供的正则表达式匹配(即,它没有自封闭元素)。我调整了修饰符以更正确地处理多行输入 - 这可能会有所帮助...以上是关于使用正则表达式关闭打开的 XML 标记的主要内容,如果未能解决你的问题,请参考以下文章