【发布时间】:2011-12-24 22:09:54
【问题描述】:
我有一个小 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};)/','&',$row['station_title']));
$xml->endElement();
$xml->startElement("descriptionline1");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_display_name']));
$xml->endElement();
$xml->startElement("descriptionline2");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_subtitle']));
$xml->endElement();
$xml->startElement("description");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_detailed_description']));
$xml->endElement();
$xml->startElement("sdimage");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['sdtv_thumbnail_graphic_url']));
$xml->endElement();
$xml->startElement("hdimage");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['hdtv_thumbnail_graphic_url']));
$xml->endElement();
$xml->startElement("uri");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['stream_url_or_playlist_url']));
$xml->endElement();
$xml->startElement("linktype");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['link_type']));
$xml->endElement();
$xml->endElement();
}
$xml->endElement();
$xml->flush();
?>
但我仍然需要解决出现的法语字符集问题。例如,如何将 é 字符替换为不会引起问题的字符?
【问题讨论】:
-
尽可能存储原始数据并在输出阶段执行转换。另外,请参阅
mysql_insert_id() -
...和
AUTO_INCREMENT