2013-11-22 2 views
0

Я пытаюсь проанализировать значение амперсанда в строке PHP. Он продолжает возвращать пустые значения после запуска моего кода, и я уверен, что это из-за значения «амперсанд» в моей переменной ($ area). Я пробовал htmlspecialchars, html_entity_decode, но безрезультатно. Пожалуйста, смотрите код ниже:Невозможно проанализировать амперсанд в строке PHP

<?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); 

?> 

Pls, как это исправить Благодаря

+0

try urlencode ($ area) – andreimarinescu

+0

Что возвращает пустые значения? Почему вы уверены, что ваша проблема возникает из-за значения в '$ area'? Почему вы не кодируете объекты перед тем, как поместить их в переменную '$ seek' (поскольку некодированные' & 'обычно недействительны в XML, если только внутри блока CDATA)? –

+0

@andreimarinescu: Это не работает – akinboj

ответ

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>. 

Я m достаточно уверен, что XML-библиотеки PHP делают это для вас прозрачно, [а также уважают набор символов], но если вы вручную создаете свой собственный XML-документ, тогда вы должны убедиться, что знаете о таких вещах, как это.

+0

Да, я попытался заменить его на &, так как это статическое значение, но, на удивление, оно не возвращает никаких значений. Это то, что действительно меня озадачивает .. В соответствии с вашим кодом я этого не понимаю. – akinboj

Смежные вопросы