我需要所有XML标记适合一行(即 clear newlines);如果可能的话,我希望清除所有其他不必要的空白,但这并不重要。
我需要这个清空的原因是:
我使用DOMDocument::schemaValidate()
根据XSD模式验证XML。该函数返回带有行号的错误,并且这些行号与我在其中显示结果的编辑器中编号的行号不匹配(因为验证器忽略标记中的换行符,而编辑器不会)。
我发现了很多关于使用regexp在两个特定分隔符之间匹配字符串的问题和答案,但不用于在两个分隔符之间匹配一些特定字符。我发现最接近的是:从XML标签中删除空白,但我无法在php中实现这一点。
示例:给定字符串
<package xmlns="http://www.idpf.org/2007/opf"
version=""
unique-identifier=""
prefix="optional"
lang="optional"
dir="optional"
id="optional"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd"
>
我需要删除标签名和属性之间的所有换行符(如果可能的话,还有所有额外的制表符和额外的空格)。输出应该如下所示:
<package xmlns="http://www.idpf.org/2007/opf" version="" unique-identifier="" prefix="optional" lang="optional" dir="optional" id="optional" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd" >
只影响<
和>
之间的空白。标签内容保持原样。
谢谢你的帮助。
您不需要正则表达式,只需使用DOMDocument::saveXML。
例子:
$xml = <<<'XML'
<package xmlns="http://www.idpf.org/2007/opf"
version=""
unique-identifier=""
prefix="optional"
lang="optional"
dir="optional"
id="optional"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd"
>
<foo>
look at my
fancy
whitespace
</foo> <bar/>
</package>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();
输出:
<?xml version="1.0"?>
<package xmlns="http://www.idpf.org/2007/opf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="" unique-identifier="" prefix="optional" lang="optional" dir="optional" id="optional" xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd">
<foo>
look at my
fancy
whitespace
</foo> <bar/>
</package>