无法在PHP字符串中解析&符号

时间:2013-11-22 20:27:33

标签: php ampersand

我正在尝试解析PHP字符串中的&符号值。它在我运行我的代码后不断返回空白值,我确信这是因为我的变量($ area)中的'&符号'。我试过htmlspecialchars,html_entity_decode但无济于事。请参阅以下代码:

<?php

/** Create HTTP POST */
$accomm = 'ACCOMM';
$state = '';
$city = 'Ballan';
$area = 'Daylesford & Macedon Ranges';
$page = '10';

$seek = '<parameters> 

<row><param>SUBURB_OR_CITY</param><value>'. $city .'</value></row>
<row><param>AREA</param><value>'. $area .'</value></row>

</parameters>';

$postdata = http_build_query(
array(
 'DistributorKey' => '******',
 'CommandName' => 'QueryProducts',
 'CommandParameters' => $seek)
);

$opts = array(
'http' => array(
'method'  => 'POST',
'header'  => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata)
);

/** Get string output of XML (In URL instance) */

$context  = stream_context_create($opts);
$result =   file_get_contents('http://national.atdw.com.au/soap/AustralianTourismWebService.asmx/CommandHandler?', false, $context);

?>

请问我该如何解决这个问题 感谢

1 个答案:

答案 0 :(得分:2)

XML不是HTML,反之亦然。您不能在XML文档中使用&,因为它是XML文档中的特殊字符。如果你只是定义一个这样的静态字符串,你可以用&amp;替换它,继续你的一天。

如果您需要编码可能包含或不包含&或其他XML特殊字符的任意字符串,那么您将需要以下函数:

function xmlentity_encode($input) {
    $match = array('/&/', '/</', '/>/', '/\'/', '/"/');
    $replace = array('&amp;', '&gt;', '&lt;', '&apos;', '&quot;');
    return preg_replace($match, $replace, $input);
}

function xmlentity_decode($input) {
    $match = array('/&amp;/', '/&gt;/', '/&lt;/', '/&apos;/', '/&quot;/');
    $replace = array('&', '<', '>', '\'', '"');
    return preg_replace($match, $replace, $input);
}

echo xmlentity_encode("This is testing & 'stuff\" n <junk>.") . "\n";
echo xmlentity_decode("This is testing &amp; &apos;stuff&quot; n &gt;junk&lt;.");

输出:

This is testing &amp; &apos;stuff&quot; n &gt;junk&lt;.
This is testing & 'stuff" n <junk>.

我很确定PHP的XML库为你做这个透明,[并且还尊重字符集]但是如果你手动构建自己的XML文档,那么你必须确保你知道这样的事情。