每一行都是一个字符串
 4
 minutes
 12
 minutes
 16
 minutes
Run Code Online (Sandbox Code Playgroud)
我能够删除Â成功使用str_replace但不删除HTML实体.我发现了这个问题:如何删除html特殊字符?
但是preg_replace并没有完成这项工作.如何删除HTML实体和A?
编辑:
我想我应该早点说过:我正在使用DOMDocument::loadHTML()和DOMXpath.
编辑:
因为这似乎是一个编码问题,我应该说这实际上是所有单独的字符串.
Tha*_*tos 18
好吧 - 我想我现在已经掌握了这个 - 我想扩展一些人们所遇到的编码错误:
这似乎是Mojibake的一个高级案例,但这是我认为正在发生的事情.MikeAinOz最初怀疑这是UTF-8数据可能是真的.如果我们采用以下UTF-8数据:
4 minutes
现在,删除HTML实体,并将其替换为实际对应的字符:U + 00A0.(这是一个不间断的空间,所以我不能完全"显示"你.你得到字符串:"4分钟".将其编码为UTF-8,你得到以下字节序列:
characters: 4 [nbsp] m i n ...
bytes : 34 C2 A0 6D 69 6E ...
Run Code Online (Sandbox Code Playgroud)
(我使用上面的[nbsp]来表示一个字面不间断的空格(字符,不是HTML实体 ,而是代表的字符.它只是空格,因此很难.)请注意[nbsp]/U + 00A0(非中断空格)需要2个字节才能以UTF-8编码.
现在,从字节流回到可读文本,我们应该使用UTF-8进行解码,因为这就是我们编码的内容.让我们使用ISO-8859-1("latin1") - 如果你使用了错误的,那么这是几乎总是这样.
bytes : 34 C2 A0 6D 69 6E ...
characters: 4 Â [nbsp] m i n ...
Run Code Online (Sandbox Code Playgroud)
并将原始的非破坏空间切换为其HTML实体表示,并获得所拥有的内容.
所以,你的PHP东西要么在错误的字符集中解释你的文本,否则你需要告诉它,或者你在错误的字符集中以某种方式输出结果.更多代码在这里很有用 - 你在哪里获得传递给这个loadHTML的数据,以及你如何获得你所看到的输出?
一些背景:"字符编码"只是从一系列字符到一系列字节的一种方式.什么字节代表"é"?UTF-8说C3 A9,而ISO-8859-1说E9.要从一系列字节中恢复原始文本,我们必须知道我们用它编码的内容.如果我们解码C3 A9为UTF-8数据,我们得到"é",如果我们(错误地)将其解码为ISO-8859-1,我们得到"é".垃圾.在伪代码中:
utf8-decode ( utf8-encode ( text-data ) ) // OK
iso8859_1-decode ( iso8859_1-encode ( text-data ) ) // OK
iso8859_1-decode ( utf8-encode ( text-data ) ) // Fails
utf8-decode ( iso8859_1-encode ( text-data ) ) // Fails
Run Code Online (Sandbox Code Playgroud)
这不是PHP代码,也不是你的修复......这只是问题的症结所在.在某个地方,大规模,正在发生,事情很困惑.
| 归档时间: |
|
| 查看次数: |
3786 次 |
| 最近记录: |