我为网络论坛继承了一些非常复杂的代码,我试图实现的功能之一就是空间不能被截断为只有一个。这主要是因为我们的用户经常希望在帖子中包含ASCII艺术,表格等。
我首先使用简单搜索并在javascript中替换,这会产生破坏HTML标记的副作用(例如<a href=....>
变为<a href=.....>
)。
然后我尝试在服务器端执行此操作,在检索字符串时,通过在链接和代码人插入之前转换空格转换为HTML。这在一定程度上起作用,但它会导致代码的其他部分出现一些问题,例如,如果消息被截断以显示在主页上,则可能会留下一些空格代码,例如
这是一条消息&amp; nb
我认为可能有一种方法可以改变原始的javascript来实现这一点 - 它只需要匹配不在HTML标记内的空格。
我最初使用的脚本是message = message.replace(/\s/g, " ")
。
感谢您提供的任何帮助。
答案 0 :(得分:6)
您可以使用pre
元素包含预先格式化的文本,该文本按原样呈现空格。见http://www.w3.org/TR/html5-author/the-pre-element.html
这些文档特别指出pre
元素的最佳用途之一是“显示ASCII艺术”。
示例:http://jsbin.com/owuruz/edit#preview
<pre>
/\_/\
____/ o o \
/~____ =ø= /
(______)__m_m)
</pre>
在您的情况下,只需将message
放在pre
标记内。
答案 1 :(得分:1)
是的,但您需要处理元素的文本内容,而不是所有HTML文档内容。此外,您需要排除style
和script
元素内容。由于您可以将自己限制在body
元素中的内容,您可以使用如下的递归函数,使用process(document.body)
调用它以将其应用于整个文档(但您可能希望将其应用于仅限特定元素:
function process(element) {
var children = element.childNodes;
for(var i = 0; i < children.length; i++) {
var child = children[i];
if(child.nodeType === 3) {
if(child.data) {
child.data = child.data.replace(/[ ]/g, "\xa0");
}
} else if(child.tagName != "SCRIPT") {
process(child);
}
}
}
(没有理由在这里使用实体引用
;您可以使用不间断空格字符U + 00A0本身,在JavaScript中将其称为"\xa0"
。)
答案 2 :(得分:1)