XML的正则表达式问题


Regular Expression issue for XML

我想将一个字符串写入XML节点,但是在这样做之前我必须去掉所有禁止的字符。我发现下面的部分可以工作:

preg_replace("/[^''x0009''x000A''x000D''x0020-''xD7FF''xE000-''xFFFD]/", "", $var)

但是,它删除了很多我想保留的字符。space;&<>'/等。

我做了一些搜索,发现空间是x0020,所以我首先尝试通过改变上面的代码来允许空格:

preg_replace("/[^''x0009''x000A''x000D''x0021-''xD7FF''xE000-''xFFFD]/", "", $var)

,但它仍然会删除空格。我只是想删除那些奇怪的隐藏的"命令"字符。我该怎么做呢?

编辑:我以前用htmlspecialchars()制作了$var,因此我想保留&;

你不必把它们去掉。

如果你使用像DOM或XMLWriter这样的XML API,它会将特殊字符编码成实体:

$document = new DOMDocument('1.0', 'UTF-8');
$document
  ->appendChild($document->createElement('foo'))
  ->appendChild($document->createTextNode("'x09'x0A'x0D'x20 ä ç <&>"));
echo $document->saveXml();
输出:

<?xml version="1.0" encoding="UTF-8"?>
<foo>   
&#13;  ä ç &lt;&amp;&gt;</foo>

XML解析器将再次解码它们:

$document = new DOMDocument('1.0', 'UTF-8');
$document->loadXml($xml);
var_dump($document->documentElement->textContent);
输出:

string(14) "    
  ä ç <&>"

您是否需要在正则表达式的末尾添加一个"u",以便PHP知道您想要Unicode匹配?参见PHP正则表达式中的UTF-8

我也想知道你是否想用空格代替这些字符,而不是什么都不写。这取决于你在做什么,但由于你在删除换行符,所以你可以让单词跨行连接。