我是远离被禁止访问网站的一个不好的问题,但是这个对我来说是值得的,我花了好几个小时试图找到问题并调试它,我根本不能,我我已经搜索了高低的答案,而且我一无所知
我正在使用PHP DOM Document Parser Object,我正在导入Wikipedia XML模板。几个小时我一直在使用substr(),我的答案就像14个左右的字符一样。因此,简而言之,事实证明,这种差异来自>并且<我有一些元素
我已经尝试了我能想到的一切,一切都是UTF-8,我尝试过类型转换为字符串,我的标题不是作为XML发送的,它是一个普通的HTML输出,我试过了,我已经尝试过mb_substr()和substr()
str_replace('<', '<', $string);
无论我做什么都无法阻止那些角色消失在深渊中,但我不知道他们要去哪里
希望有人可以对此有所了解
编辑: 为了清理它,我直接从维基百科下载了一个XML文件,其中一行就是:
<small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
现在如果我使用:
dd(mb_substr($str, 1, 2))
我希望“LT”,但实际上我得到的是“sm”,它正在处理“&lt;”作为单个字符,但如果我在Sublime,Notepad ++,EmEditor等中打开文件,则为4个字符
我不明白PHP如何处理字符串,即使我使用str_replace()它也拒绝成为HTML实体
EDIT2:
如果你去这个地址:
https://en.wikipedia.org/wiki/Special:Export
并在框中输入“London”,它将下载一个XML文件
在课堂上或使用此代码时,请使用以下代码:
$this->file = new \DOMDocument;
$this->file->load('C:\path-to-your-xm-file.xml');
$pages = $this->file->getElementsByTagName('page');
foreach($pages as $page)
{
die(mb_substr($page->getElementsByTagName('text')->item(0)->nodeValue, 343, 1));
}
现在第344个字符应该是&符号,但是它给出了整个“&lt;”
答案 0 :(得分:2)
据我所知,它是关于XML解析器的。 按照XML标准,必须将三个字符编码并解码为:
‘< ‘ to <
> to >
& to &
然后任何(和所有)解析器必须执行下一步:
假设您需要将文本节点(或属性值)设置为字符串为
< my text & some more >
然后假设它是XML标记中的文本节点<TextValue>
根据XML标准,此类文本可以以两种形式呈现在XML文档中:
<TextValue>< my text & some more ></TextValue>
<TextValue><![CDATA[<my text & some more>]]></TextValue>
< my text & some more >
解析器执行XML解码并返回实际的字符串值。它与实际的Parser实现(浏览器中的PHP,Java,DOM或其他任何内容无关。它是标准。
PS。如果您手头有任何具有XPath功能的XML工具,您可以使用该示例并完全看到已定义的行为。
UPD:所以您的XML演示文稿是:<small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
然后实际的字符串为<small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
当然,字符串长度为49而不是67,mb_substr($str, 1, 2)
从实际字符串值返回sm
,而不是从XML编码表示中返回lt