【问题标题】:Regular Expression issue for XMLXML 的正则表达式问题
【发布时间】:2016-01-06 01:57:42
【问题描述】:

我想将一个字符串写入一个 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,因此我想保留&;

【问题讨论】:

标签: php regex xml


【解决方案1】:

您不必剥离它们。

如果您使用像 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) "    

  ä ç <&>"

【讨论】:

    【解决方案2】:

    您是否需要在您的正则表达式末尾添加一个“u”,以便 PHP 知道您想要 Unicode 匹配?另见UTF-8 in PHP regular expressions

    我还想知道您是否想用空格替换这些字符,而不是什么都不替换。取决于您在做什么,但是由于您要删除换行符,因此您可以将单词跨行连接起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多