[英]PHP xml_parse_into_struct breaks because of ´
我正在嘗試將xml轉換為PHP數組。 問題是xml_parse_into_struct僅在遇到´
之前轉換字符串。 我有以下代碼。
$xmlStr = file_get_contents($url);
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING , "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING , 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE , 1);
xml_parse_into_struct($parser, trim($contents) , $xml_values);
作為HTML查看時它像there´s
。 任何幫助都感激不盡。
您是否嘗試過SimpleXML
例如
libxml_use_internal_errors(true);
$xml_string = file_get_contents($url);
$xml_string = html_entity_decode($xml_string, ENT_QUOTES, "utf-8");
$xml_data = new SimpleXMLElement($xml_string);
var_dump($xml_data); // displays object array
´
是XML中未知的命名實體,您不能將其作為純XML加載,只能作為(X)HTML加載。
您可以使用DOMDocument加載HTML,但是默認情況下,這會將文檔“修復”為完整的html文件:
$html = '<p>there´s an acute</p>';
$dom = new DOMDocument();
$dom->loadHtml($html);
echo $dom->saveXml();
輸出:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>there´s an acute</p></body></html>
您會看到´
轉換為數字編碼。 這在XML中有效,命名實體無效(不是沒有DTD,XSD的實體)。
這是另一種方法,您可以使用字符串函數將所有命名的實體解碼為utf-8:
$html = '<p>there´s an acute</p>';
$namedEntities = array_flip(
array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'),
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8')
)
);
$xml = strtr($html, $namedEntities);
$dom = new DOMDocument();
$dom->loadXml($xml);
echo $dom->saveXml();
輸出:
<?xml version="1.0"?>
<p>there´s an acute</p>
即使您目前正在使用舊的擴展程序,該功能也可以使用:
$html = '<p>there´s an acute</p>';
$namedEntities = array_flip(
array_diff(
get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8'),
get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES, 'UTF-8')
)
);
$xml = strtr($html, $namedEntities);
$parser = xml_parser_create ('utf-8');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $xml, $xml_values);
var_dump($xml_values);
輸出:
array(1) {
[0]=>
array(4) {
["tag"]=>
string(1) "p"
["type"]=>
string(8) "complete"
["level"]=>
int(1)
["value"]=>
string(17) "there´s an acute"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.