xml中怎样同时读取二进制和utf8字符

现有一数组:

Array ( [oReturn-Path] => [Delivered-To] => yushuai.niu@bkmail.netchina.com.cn [Received] => (ncmail 17263 invoked by uid 401); 01 Feb 2012 01:39:57 -0000 [Message-ID] => <20120201013957.17262.ncmail@bkmail.netchina.com.cn> [Date] => Wed, 01 Feb 2012 09:39:57 +0800 [From] => yushuai.niu@bkmail.netchina.com.cn [MIME-Version] => 1.0 [Subject] => subject [To] => yushuai.niu@bkmail.netchina.com.cn [Content-Type] => multipart/mixed; boundary="------------1463804415-2084078365-1328060397=:2673" [Time] => 2012-02-01 09:39:57 [Size] => 1.12 KB [Attachs] => Array ( [attach] => Array ( [0] => Array ( [id] => 2 [name] => attach.txt [level] => 非密 ) ) ) [bodyId] => 1 )

编译成xml:

<data>
<^LReturn-Path><yushuai.niu@bkmail.netchina.com.cn></^LReturn-Path>
<Delivered-To>yushuai.niu@bkmail.netchina.com.cn</Delivered-To>
<Received>(ncmail 17263 invoked by uid 401); 01 Feb 2012 01:39:57 -0000</Received>
<Message-ID><20120201013957.17262.ncmail@bkmail.netchina.com.cn></Message-ID>
<Date>Wed, 01 Feb 2012 09:39:57 +0800</Date>
<From>yushuai.niu@bkmail.netchina.com.cn</From>
<MIME-Version>1.0</MIME-Version>
<Subject>subject</Subject>
<To>yushuai.niu@bkmail.netchina.com.cn</To>
<Content-Type>multipart/mixed; boundary="------------1463804415-2084078365-1328060397=:2673"</Content-Type>
<Time>2012-02-01 09:39:57</Time>
<Size>1.12 KB</Size>
<Attachs>
<attach>
<id>2</id>
<name>attach.txt</name>
<level>非密</level>
</attach>
</Attachs>
<bodyId>1</bodyId>
</data>

在读取xml文件并将其转换成数组时,在<^LReturn-Path>会出错,因为其中包含二进制码,我应该怎样避免它,或者可以读取它……
...全文
424 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2012-03-02
  • 打赏
  • 举报
回复
是的,基本的 xml 的 标签名 的命名应符合 变量名 的命名规则
  • 打赏
  • 举报
回复
我又看了一下,确实滤掉了,我没将preg_replace的返回值赋予变量,真是抱歉:

……
<turn-Path><seandeg1@gmail.com></turn-Path>
……
<3Burn-Path><seandeg1@gmail.com></3Burn-Path>
……

但我在用上面的xml函数解析的时候:
XML error: XML_ERR_NAME_REQUIRED at line 43
我仔细看了下,没发现代码有错误啊,是不是xml的标签名中不能用数字开头?
xuzuning 2012-03-02
  • 打赏
  • 举报
回复
oReturn-Path

内码:
过滤前 \x01\x6f\x03\x01\x52\x65\x74\x75\x72\x6e\x2d\x50\x61\x74\x68
过滤后 \x6f\x52\x65\x74\x75\x72\x6e\x2d\x50\x61\x74\x68

如果你还需要去掉 -
则规则为 /[-\x0-\x1f]/

如果你只想保留合法的命名
则规则为 /\W/
  • 打赏
  • 举报
回复
嗯,问题基本解决了,但是xml元素内容还有 无效字符 存在,但是和o还不是一个类型的,晕菜了。
我正努力寻找中,感谢版主的帮助!
  • 打赏
  • 举报
回复
大家看看怎么将xml中的"Invalid character"过滤掉:

<?xml version="1.0" encoding="utf-8"?>
<mailindex>
<datas>
<data>
<oReturn-Path><yushuai.niu@bkmail.netchina.com.cn></oReturn-Path>
<Delivered-To>yushuai.niu@bkmail.netchina.com.cn</Delivered-To>
<Received>(ncmail 17263 invoked by uid 401); 01 Feb 2012 01:39:57 -0000</Received>
<Message-ID><20120201013957.17262.ncmail@bkmail.netchina.com.cn></Message-ID>
<Date>Wed, 01 Feb 2012 09:39:57 +0800</Date>
<From>yushuai.niu@bkmail.netchina.com.cn</From>
<MIME-Version>1.0</MIME-Version>
<Subject>subject</Subject>
<To>yushuai.niu@bkmail.netchina.com.cn</To>
<Content-Type>multipart/mixed; boundary="------------1463804415-2084078365-1328060397=:2673"</Content-Type>
<Time>2012-02-01 09:39:57</Time>
<Size>1.12 KB</Size>
<Attachs>
<attach>
<id>2</id>
<name>attach.txt</name>
<level>非密</level>
</attach>
</Attachs>
<bodyId>1</bodyId>
</data>
<data>
<^LReturn-Path><seandeg1@gmail.com></^LReturn-Path>
<Delivered-To>sean.yan@email.netchina.com.cn</Delivered-To>
<Received>by 10.180.84.98 with HTTP; Sun, 29 Jan 2012 19:05:12 -0800 (PST)</Received>
<DKIM-Signature>v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:sub
ject:from:to :content-type; bh=6HSCkxH4EtEI801Yan/oYF7mNVUNULbL3owo3o9Z0YQ=; b=iD0DjhMG1dRC/iJKRr7FnrtXXieSfbBEZXt58MCmpyaYOBBvLjS4/s4DWHph9DxWBR OBD0Ge/u2za
ab0LoB95D7kggOMXUWOcL9iG0VgOpn2qdgbryGs2+hasVaZ8iTkNgFoXb k1JqJmLp8zu0ESJ54JwpizIv9VwkBDQGkSQik=</DKIM-Signature>
<MIME-Version>1.0</MIME-Version>
<In-Reply-To><CAExYbSWP_XvcJRhj3yMSOOr8h4dLTdbk_d8W1dMeVcmYZ=PpYg@mail.gmail.com></In-Reply-To>
<References><CAExYbSXhNw1f1ks8LkPi01aa64iUZsMXPkiHjJ_dkFCLu-0fPg@mail.gmail.com> <CAExYbSWP_XvcJRhj3yMSOOr8h4dLTdbk_d8W1dMeV
cmYZ=PpYg@mail.gmail.com></References>
<Date>Mon, 30 Jan 2012 11:05:12 +0800</Date>
<Message-ID><CAExYbSVcMscurCqoydUpVHwGqv012o40jFYQ=hhwScQKE1eoyQ@mail.gmail.com></Message-ID>
<Subject>Fwd: test gmail</Subject>
<From>sean yan <seandeg1@gmail.com></From>
<To>sean.yan@email.netchina.com.cn</To>
<Content-Type>multipart/mixed; boundary=f46d0444eab777d31604b7b61d56</Content-Type>
<Time>2012-01-30 11:05:12</Time>
<Size>120.92 KB</Size>
<Attachs>
<attach>
<id>2</id>
<name>.jpg</name>
<level>非密</level>
</attach>
<attach>
<id>3</id>
<name>.jpg</name>
<level>非密</level>
</attach>
<attach>
<id>4</id>
<name>.jpg</name>
<level>非密</level>
</attach>
</Attachs>
<bodyId>1.1</bodyId>
</data>
</datas>
</mailindex>

我用了

//过滤无效字符
function XmlSafeStr($s) {
return preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/", '', $s);
}

还有错误啊:XML error: XML_ERR_NAME_REQUIRED at line 50
  • 打赏
  • 举报
回复
将xml无法识别的字符全部用空格替换,怎么做?
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xuzuning 的回复:]

不知道你的 "无效字符" 是如何定义的
[/Quote]
将数组中的[oReturn-Path]编译为<^LReturn-Path>,其中的 ^L 就是“无效字符”,有时会编译为
<oReturn-Path>,其中 o 也是 无效字符,很纠结。
如果只是将非英文、非汉字字符、非正常符号挑出来,并用“ ” 替换,正则怎么写?
虽然^L看似可读,但在读取文件时,就是提示无效……
代码如诗 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dmtnewtons 的回复:]
版主能否给个过滤 非有效字符 的正则?我先凑活用用!
[/Quote]
要凑合的话,replace掉^就行了啊
$xml=<<<XML
<data>
<^LReturn-Path><yushuai.niu@bkmail.netchina.com.cn></^LReturn-Path>
<Delivered-To>yushuai.niu@bkmail.netchina.com.cn</Delivered-To>
........
<bodyId>1</bodyId>
</data>
XML;
$xml=&str_replace('^','',$xml);
$obj=simplexml_load_string($xml);
print_r($obj);
xuzuning 2012-03-01
  • 打赏
  • 举报
回复
不知道你的 "无效字符" 是如何定义的
  • 打赏
  • 举报
回复
版主终于发话了……
请问如何将xml中的 "无效字符" 用 "空格" 替换,在讲数组编译为xml前,正则该怎么写呢?
xuzuning 2012-03-01
  • 打赏
  • 举报
回复
并未发现 <^LReturn-Path> 中包含二进制码,况且 ^LReturn-Path 做键名也不会出错
注意:在 php 的关联数组中,键名可以是任何你能想象到的值

只不过 ^LReturn-Path 不符合基本 XML 标记命名的约定,所以你需要在解析时做特殊处理
  • 打赏
  • 举报
回复
我用了一个

preg_match('/^ [ [:alnum:] [:space:] [:punct:] ]+ $/x',$title);

但是无法完全过滤:
XML error: Invalid character at line 66 。

正则高手来帮忙啊……
黄袍披身 2012-03-01
  • 打赏
  • 举报
回复
我也在想正则的事情,是否可以过滤非 字母和数字 或者- 的所有字符?
如果是非有效字符我不清楚这个应该怎么写,正则我是菜鸟.

[Quote=引用 4 楼 dmtnewtons 的回复:]

版主能否给个过滤 非有效字符 的正则?我先凑活用用!
[/Quote]
  • 打赏
  • 举报
回复
版主能否给个过滤 非有效字符 的正则?我先凑活用用!
  • 打赏
  • 举报
回复
其实这是从邮件中直接解析出来的数组,而有些邮件头会有一些二进制标记,所以解析时就出现了上述情况……
黄袍披身 2012-03-01
  • 打赏
  • 举报
回复
這個數組爲什麼會出現 o 這樣無法識別的內容呢?
  • 打赏
  • 举报
回复
晕,一晚上过去一个回复也没有啊,顶一下,帮忙出谋划策啊……$_$
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xuzuning 的回复:]

特殊字符出现在关联按键

foreach ($arr as $ent => $val) {
$ent = preg_replace('/[\x0-\x1f]/', '', $ent); //加入这个
[/Quote]

ent-->>��Return-Path
没有过滤掉啊
xuzuning 2012-03-01
  • 打赏
  • 举报
回复
特殊字符出现在关联按键

foreach ($arr as $ent => $val) {
$ent = preg_replace('/[\x0-\x1f]/', '', $ent); //加入这个
  • 打赏
  • 举报
回复
鄙视楼上,起码要给点建议呀。但感谢光顾,结贴时会考虑的。
我等得花都谢了……好辛苦啊(ˇˍˇ) ~
加载更多回复(6)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧