2010-01-31 95 views
4

我在我的一个PHP站点上有一个非常奇怪的输出损坏。有时候会显示一段HTML代码,而不是被解释的标签。它看起来像一些字符丢失,搞乱了标签。请参阅下面的示例:第二行应该是指向c1的链接,但由于某些原因会显示部分目标网址。奇怪的PHP输出损坏

alt text http://trappist.elis.ugent.be/~wheirman/atuin/tmp/phpstrangeness.png

问题是暂时的,刷新通常可以解决它。这可能发生在页面的不同部分(尽管通常在相同的位置)。只有Safari看起来受到了影响(但我怀疑Firefox只是由于更宽容的解析而掩盖了这个问题)。它发生在我的开发服务器上作为活动服务器,它们都有稍微不同的设置(输出缓冲,分块传输),尽管它发生的可能性似乎有所不同。

任何曾经见过这样的事情?

编辑

当我“查看源文件”在Safari这个页面上,我得到以下HTML:

<tr class="odd"> 
    <td>73</td> 
    <td><a href="companies.php?view=1&amp;companyid=73&amp;return=%2Foffice%2Fcompanies.php">c1</a></td> 
    <td></td> 
    <td><img src='/images/dot_blue.png' class="altTooltip" alt="inactive: no account" /> </td> 

我看不出什么错,所以使用Safari有重新加载页面,当我问它的来源,或者我不够努力......

+0

你可以发布有问题的html页面吗? – roman 2010-01-31 16:30:15

+0

你可以发布导致这种情况的HTML吗?也许通过验证器运行它,看看会发生什么。 – Thomas 2010-01-31 16:30:53

+0

不幸的是,我一直无法得到错误的HTML。当我在Safari浏览器中查看源代码时,它似乎重新加载页面,并且错误消失了...... – Wim 2010-01-31 16:35:17

回答

1

我终于找到了问题(使用Web Inspector):TinyMCE已经插入标签(它用来加载语言文件和扩展模块) ,在看似随机的地方里面我自己的HTML。结果是,在我的截图中可以看到的情况下,如<a href="foo<script src="tinymce/lang/en.js">bar.php">foobar</a>

由于我也在同一页面上使用jQuery,我的猜测是它最终是由于jQuery对DOM和TinyMCE的添加同时发生的添加而导致的某种竞争条件(由bug引起的)只在Safari中出现)。

我现在用的TinyMCE的jQuery的构建,以及所有一直以来良好...

感谢大家的帮助!

2

嗯,这是我在黑暗中的镜头。

在fi字符组合后,中断发生在单词“office”中。我敢打赌,fi ligature是 - 不知何故 - 造成麻烦。

究竟如何?由于该HTML代码不包含连字符,因此这可能是Safari中的一个错误。特别是因为它随机发生。您可以尝试重命名该文件,并查看问题是否消失?

使用有效的HTML也可能有助于避免此问题,因为它使解析更容易。

+0

这是一个非常聪明的想法,但它看起来像是URL的一部分。我几乎无法想象那里真的有一个'fi'。 – 2010-01-31 17:00:27

+0

除非它是一个错误,并且解析器的一部分将其视为可见文本。然后fi - > fi替换可能是有道理的。 – Thomas 2010-01-31 17:18:28

+0

我也在思考一个Safari渲染错误。数百次下载和比较文件不会导致任何更改,当我将其存储在服务器上时,页面内容也没有任何问题。而且,正如你在屏幕截图中看到的,右侧的3个图标在彼此之上。刷新后,它们彼此相邻。在IE和FF中,我都没有看到它们垂直渲染。 – Wim 2010-01-31 17:26:01

1

当您选择一段HTML并查看源代码时,您得到的并不是100%。例如,所有人&的是&amp;,这可能意味着您选择了违规文本并查看了所选内容的来源。

如果您仍然遇到问题,请尝试查看整个源代码而不选择任何内容,然后使用Ctrl + F在代码中查找该位置,然后尝试给我们一个更大的示例,而不仅仅是违规的行,但是一个正确的行,并在一个更大的背景下。

例如,当使用表格时,错列的<td>可能会产生非常奇怪的后果,这看起来不像那种类型的问题,我只是说我们需要上下文才能提供帮助。

还有一个问题,一些浏览器为了查看源代码,实际上重新提交页面并获取它的第二个副本。我有一种感觉,那就是真实输出文本的代码,所以再看看吧,如果你正在使用类似

<?= $someVar ?> 

,并确保它不喜欢这样的:

<a href=<?= isset($x) ?'"'. $someVar.'"': '"'.$someOlderVar.'">'?>> xxx </a> 

所以,没有selecty ,请更大的样品。我们需要从代码输出错误的HTML ...

+0

“例如,你们所有人都是&,这可能意味着你选择了违规文本并查看了所选内容的来源。”为什么会这样?将它们放在HTML中时,转义URL(包括放入&)是正常的。 – 2010-02-03 13:05:40

+0

您误解了,您不会在网址中转义HTML实体,即&符号是网址的有效符号,不应该由html实体版本替代,您的网址在您执行此操作时会表现得异常。 – 2010-02-04 12:40:23

+0

@jolierouge:除了在将它放入HTML文档时将其转义。 ''无效,因为没有companyid并返回HTML实体。 – Powerlord 2010-02-04 14:21:42