Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理HTML/php表单中输出为XML的所有特殊字符_Php_Html_Xml - Fatal编程技术网

如何处理HTML/php表单中输出为XML的所有特殊字符

如何处理HTML/php表单中输出为XML的所有特殊字符,php,html,xml,Php,Html,Xml,我组装了一个php/mysql应用程序,它接受一个输入表单并将其存储在mysql数据库中,然后将数据作为XML输出,供无线播放硬件设备使用 问题在于符号和其他字符。用户正在记录各种广播电台的描述,以及流式URL或播放列表URL,并将它们粘贴到表单中。一些广播电台设在非英语国家(主要是法语国家)。我需要知道如何预处理这些字段,以便生成的XML不会损坏,从而破坏外部硬件应用程序 我假设这应该进入提交表单时调用的php中。我很确定应该使用htmlspecialchars函数,但我不确定最好的方法,因为

我组装了一个php/mysql应用程序,它接受一个输入表单并将其存储在mysql数据库中,然后将数据作为XML输出,供无线播放硬件设备使用

问题在于符号和其他字符。用户正在记录各种广播电台的描述,以及流式URL或播放列表URL,并将它们粘贴到表单中。一些广播电台设在非英语国家(主要是法语国家)。我需要知道如何预处理这些字段,以便生成的XML不会损坏,从而破坏外部硬件应用程序

我假设这应该进入提交表单时调用的php中。我很确定应该使用htmlspecialchars函数,但我不确定最好的方法,因为我已经从各种来源对其进行了黑客攻击:

更新:这是我当前的输出代码,其中包含一些清除符号的正则表达式

<?
include("HLN/manager/connect.php");

$query = "SELECT * FROM hln_stations ORDER BY orderid ASC";
$result = mysql_query($query);

$num = mysql_num_rows ($result);
mysql_close();

$xml = new XMLWriter();

$xml->openURI("php://output");
$xml->startDocument();
header('Content-type: text/xml');
$xml->setIndent(true);

$xml->startElement('channels');

while ($row = mysql_fetch_assoc($result)) {

  $xml->startElement("channel");
     $xml->startElement("title");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_title']));
     $xml->endElement();
     $xml->startElement("descriptionline1");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_display_name']));
     $xml->endElement();

     $xml->startElement("descriptionline2");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_subtitle']));
     $xml->endElement();

     $xml->startElement("description");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_detailed_description']));
     $xml->endElement();

     $xml->startElement("sdimage");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['sdtv_thumbnail_graphic_url']));
     $xml->endElement();

     $xml->startElement("hdimage");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['hdtv_thumbnail_graphic_url']));
     $xml->endElement();

     $xml->startElement("uri");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['stream_url_or_playlist_url']));
     $xml->endElement();

     $xml->startElement("linktype");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['link_type']));
     $xml->endElement();

 $xml->endElement();
}

$xml->endElement();


$xml->flush();

?>

但我仍然需要解决出现的法语字符集问题。例如,我如何用不会引起问题的字符替换é字符?

如果您想真正“清理法语字符”(删除)

做这个()怎么样

如果你真的想“清除法语字符”(删除)

做这个()怎么样


Firefox中有一个错误,表示格式不正确,因为检测到的字符集与输出的字符集不匹配。我尝试了各种字符集的组合,可以重现这个问题

必须明确指定角色集,例如:

header('Content-type: text/xml; charset=UTF-8');
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
如果在内容类型和XML中将字符集指定为UTF-8时出错,则表示您的输入无效UTF-8,请改用ISO-8859-15,或重新编码您的输入

您必须为站点的每个页面添加内容类型字符集标题,包括用于输入数据的表单,否则您的特殊字符可能会被弄乱。此外,还必须连接到mysql,指定要用于连接的字符集,并且该字符集应与表的字符集和排序规则相匹配

假设您使用的是UTF-8,请使用PHPMyAdmin和UTF-8连接查看您的数据库,如果您不能很好地看到您的特殊字符,则表示您做错了什么

对于设备,如果您说它只能显示ASCII字符,那么在您提供UTF-8输入时,它是否为您进行转换,或者您是否必须提供以下实体:

Ch&#xE9;rie 
如果这两个选项不起作用,您可能需要转换为ASCII,例如“Cherie”。。。但那将是最后的手段


不使用DB的概念验证代码:

<?php

header('Content-type: text/xml; charset=UTF-8');

$radioArr = array(
   array("Chérie FM @Work", "http://www.listenlive.eu/cheriefm_atwork.m3u?p&test"), 
   array("Hélène FM", "http://broadcast.infomaniak.ch/helenefm-high.mp3.m3u")
);
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
$xml->setIndent(true);
$xml->startElement('channels');
foreach ($radioArr AS $radio) {
     $xml->startElement("channel");

     $xml->startElement("title");
     $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;', $radio[0]));
     $xml->endElement();

     $xml->startElement("uri");
     $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;', $radio[1]));
     $xml->endElement();

     $xml->endElement(); //end channel
}

$xml->endElement();
$xml->flush();

?>

Firefox中有一个错误,表示格式不正确,因为检测到的字符集与输出的字符集不匹配。我尝试了各种字符集的组合,可以重现这个问题

必须明确指定角色集,例如:

header('Content-type: text/xml; charset=UTF-8');
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
如果在内容类型和XML中将字符集指定为UTF-8时出错,则表示您的输入无效UTF-8,请改用ISO-8859-15,或重新编码您的输入

您必须为站点的每个页面添加内容类型字符集标题,包括用于输入数据的表单,否则您的特殊字符可能会被弄乱。此外,还必须连接到mysql,指定要用于连接的字符集,并且该字符集应与表的字符集和排序规则相匹配

假设您使用的是UTF-8,请使用PHPMyAdmin和UTF-8连接查看您的数据库,如果您不能很好地看到您的特殊字符,则表示您做错了什么

对于设备,如果您说它只能显示ASCII字符,那么在您提供UTF-8输入时,它是否为您进行转换,或者您是否必须提供以下实体:

Ch&#xE9;rie 
如果这两个选项不起作用,您可能需要转换为ASCII,例如“Cherie”。。。但那将是最后的手段


不使用DB的概念验证代码:

<?php

header('Content-type: text/xml; charset=UTF-8');

$radioArr = array(
   array("Chérie FM @Work", "http://www.listenlive.eu/cheriefm_atwork.m3u?p&test"), 
   array("Hélène FM", "http://broadcast.infomaniak.ch/helenefm-high.mp3.m3u")
);
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
$xml->setIndent(true);
$xml->startElement('channels');
foreach ($radioArr AS $radio) {
     $xml->startElement("channel");

     $xml->startElement("title");
     $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;', $radio[0]));
     $xml->endElement();

     $xml->startElement("uri");
     $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;', $radio[1]));
     $xml->endElement();

     $xml->endElement(); //end channel
}

$xml->endElement();
$xml->flush();

?>

使用CDATA包装数据。不要使用writeRaw()而是使用writeCData() 请参考下面的示例

// CData output
$xml->startElement('title');
$xml->writeCData($row['station_subtitle']);
$xml->endElement();

使用CDATA包装数据。不要使用writeRaw()而是使用writeCData() 请参考下面的示例

// CData output
$xml->startElement('title');
$xml->writeCData($row['station_subtitle']);
$xml->endElement();

尽可能原始地存储数据,并在输出阶段执行转换。还有,请看。。。并尽可能原始地存储数据,并在输出阶段执行转换。还有,请看。。。该设备可以接受XML格式的utf-8,但只能在屏幕上显示ASCII字符。这里有一个导致问题的字符串:Nous vous souhaitons la plus cordiale bienvenue sur the site de la Radio Shalom Fm。每24天24小时都有酒和酒的味道。您对trois grands fondementsévangéliquesásavoir的节目多样性有何看法:la prière,l'Enseignment et lévangélisationwell ASCII是0-127个字符的范围,不包括任何重音字母,因此,如果它真的只能接受ASCII,那么你唯一能做的就是将重音字母转换成基本的对应字母。你确定吗?使用unicode怎么样?这个“Ché;rie”能用吗?我试过你的字符串,至少在Firefox中没有问题。所有表单上的内容类型都是:Content=“文本/html;字符集=iso-8859-1。PhpMYAdmin是UTF-8连接,如果我将其粘贴到一个字段中,则会在那里显示é,并且,即使添加了您建议的xml头和startdocument,如果我将该字符放入表单中的字段中,仍然会出现错误;字符集=iso-8859-1。PhpMYAdmin是UTF-8连接,如果我将其粘贴到一个字段中,“->这证实了我的担心,您的DB数据保存在UTF-8中,但是您