如何通过PHP处理XML输出中的水平省略号(三个点)字符

时间:2011-06-30 14:15:37

标签: php xml ellipsis

正如问题所述,我正在尝试使用PHP从MySQL的文本字段中读取数据来生成XML输出(对于iPhone应用程序)。

只要字段中存在水平省略号字符,就无法正确生成XML。

我已经尝试了一些方法来逃避它,如下所示,但似乎没有工作......

$row['detail'] = str_replace("&", "&", $row['detail']); 
$row['detail'] = str_replace("…", "&hellip;", $row['detail']); //<-- prob is here
$row['detail'] = str_replace("<", "&lt", $row['detail']); 
$row['detail'] = str_replace("\'", "&apos;", $row['detail']); 
$row['detail'] = str_replace(">", "&gt;", $row['detail']); 
$row['detail'] = str_replace("\"", "&quot;", $row['detail']); 

我基本上有两个问题,

  1. 如何处理水平省略号字符?

  2. 是否还有更多此类字符会导致此类问题?对此列表及其解决方案的任何引用都会很棒!

  3. 谢谢

3 个答案:

答案 0 :(得分:8)

可以(以及推荐的方式)在XML输出中使用文字的实际字符。不要使用基于HTML实体的解决方法 - 这是不必要的。

它不适合您的原因可能是因为省略号字符的编码与正在生成的XML文件的编码不匹配。

你只需要确保它们匹配。例如,如果您要生成UTF-8 XML文件,则省略号字符也必须是UTF-8。

答案 1 :(得分:4)

原始XML不知道除&gt;&lt;`&amp;之外的任何命名实体。所有其他实体都需要声明为数字字符代码,否则您需要在Doctype或DTD中指定实体。

{DT}中定义了&hellip;实体,所有浏览器都能理解它,但大多数其他XML DTD都没有定义它。

一般情况下,如果您正在使用DTD,大多数情况下它将是您无法控制的第三方DTD,因此您无法向其添加实体。您也不希望将实体ad-hoc添加到您自己的DTD中。

我也会避免将实体声明放入doctype标头中。除非你在文档中一遍又一遍地重复相同的实体,否则它不会增加太多不必要的毛茸茸。

因此我的建议只是使用数字实体。

因此,您可以使用字符代码实体&hellip;&#x2026;代替&#8230;。这同样适用于任何其他非ascii字符。

另一个选择当然是使用UTF-8或UTF-16字符编码输出XML,这完全不需要任何实体。这可能是也可能不是你的选择,但如果可能的话,这可能是最好的选择。

如果您有一个特定字符,您需要找到数字实体代码,网上有很多地方可以找到它们的参考。以下是维基百科的内容:http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

希望有所帮助。

答案 2 :(得分:0)

XML只能理解几个字符实体'"&<>。任何事都会导致文件无效。您可以尝试使用

将实体添加到DTD
 <!DOCTYPE text [ <!ENTITY hellip "&#x2026;"> ]>