簡體   English   中英

PHP xml_parse_into_struct因“

[英]PHP xml_parse_into_struct breaks because of &acute

我正在嘗試將xml轉換為PHP數組。 問題是xml_parse_into_struct僅在遇到&acute之前轉換字符串。 我有以下代碼。

$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&acute;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&#xB4;s an acute</p></body></html>

您會看到&acute; 轉換為數字編碼。 這在XML中有效,命名實體無效(不是沒有DTD,XSD的實體)。

這是另一種方法,您可以使用字符串函數將所有命名的實體解碼為utf-8:

$html = '<p>there&acute;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&#xB4;s an acute</p>

即使您目前正在使用舊的擴展程序,該功能也可以使用:

$html = '<p>there&acute;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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM