4

我确信这不应该是可能的。不知何故,我的 HTML 标记中的段落中的多个空格没有折叠。它们不是 &nbsp;不在<pre>标签中,没有设置white-space: pre-wrap;orwhite-space: pre;并且行为不会通过强制style="white-space: normal;"元素而改变。

我的理解是,这是保留空白的唯一三种方式,并且可以在 HTML 中显示两个或多个空格。

所以问题是:还有什么可能导致连续空格显示为多个空格?肯定还有别的东西——但在我知道它是什么之前我无法找到它,而且我找到的每个来源都只是在谈论&nbsp;<pre>或者white-space: pre-wrap;white-space: pre;

关键编辑:使用 Firebug,我尝试删除一些有问题的空格并再次输入。当从键盘删除并重新输入时,空格的行为正常 - 浏览器中没有意外的空格。因此,它必须是某个字符在视图源、文本编辑器等中显示为纯空格,但实际上行为类似于&nbsp;. 它可能是什么,至关重要的是,我如何识别它以将其删除?违规输入的原始来源是所见即所得的编辑器 TinyMCE,所以我添加了那个标签......


更多详细信息:我有一些包含包含多个空格的段落文本的 HTML,如下所示(在 ...s 之间是直接从 Firefox 视图源复制的):

<p> blah blah.... nothing  more  than  a ... blah blah </p>

如您所见,这些是常规空格,而不是 &nbsp;. 该文档在&nbsp;其他地方,它们在视图源中显示为这样,因此它们不会&nbsp;以某种方式伪装成源中的正常空间。

此外,CSS设置为 white-space: pre;或类似:

  • Firebug 的“计算”面板没有列出与空格相关的规则。
  • 在段落上强制 awhite-space: normal;对空格没有影响。该规则确实显示在 Firebug 'Computed' 面板中,因此它正在应用。
  • 应用于white-space: pre-wrap;段落会导致其他更改,但不会更改这些多个顺序空间。例如,它会在选定文本段落中的每个换行符的末尾显示一个额外的空格。所以它绝对不会以某种方式被悄悄地设置为white-space: pre-wrap;

文档中没有 <pre> 标签,任何地方。在<pre源码中查找什么也没找到。

因此,它应该在浏览器中显示,每个单词之间有一个空格。它没有。它显示多个空格,就好像它是<pre>or&nbsp;white-space: pre;。但这些都不是。

一定有其他方法可以获得 white-space: pre;我不知道的类似效果。还有哪些其他方法可以预先格式化空格并阻止多个空格折叠?这可能是什么原因造成的。


一些背景说明:

  • 在哪些浏览器中看到?Firefox 16.0.2、谷歌浏览器 23.0.1271.95 m (Windows)
  • 如果您不希望它可见,为什么在标记中有双倍空格?我正在为 CMS 进行前端/设计工作,用户将通过 TinyMCE 所见即所得(不可协商)从 Word 和 PDF 中输入文本。因此,标记将是混乱的。修复 CMS 文本格式化程序以清理空白和清除标记超出了本工作的范围。
  • 文档类型? <!DOCTYPE html PUBLIC "-//W3C//DTD HTML+RDFa 1.1//EN">
  • 你确定有多个空格?当然,您可以在浏览器前端的单词之间选择一个、两个,在某些情况下是三个空格。
  • 我可以看到所有的代码吗?抱歉,这是一个预发布网站,不公开。随意询问特定的 CSS 规则、HTML 标签、加载的 javascript 内容等。
4

1 回答 1

6

我猜你的源代码中违规的空格字符不是SPACE (U+0020),但实际上是NO-BREAK SPACE (U+00A0)。从视觉上看,它们看起来相同,但如果您在十六进制编辑器中查看源代码(显示文件中的各个字节),您会看到这些字符的不同编码。

编辑 1

这个 PHP 代码应该找到并用常规空格替换有问题的字符:

$strNoBreakSpace = mb_convert_encoding('&#x00A0;', 'UTF-8', 'HTML-ENTITIES');
$strNormalSpace  = mb_convert_encoding('&#x0020;', 'UTF-8', 'HTML-ENTITIES');

$strInput = str_replace( $strNoBreakSpace, $strNormalSpace, $strInput );

编辑 2

创建两个空格字符的更简单方法:

$strNoBreakSpace = json_decode('"\u00A0"');
$strNormalSpace  = json_decode('"\u0020"');
于 2012-12-04T21:09:44.270 回答