65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP 中的文本预览

2000 年 7 月 9 日

viewsIcon

117588

如何在 ASP 中生成文本的短预览。

引言

在 ASP 应用程序中显示大量文本的任务似乎是最近一个非常热门的话题。具体来说,在过去的一个月里,我遇到过关于如何显示文本前 N 个字符的最佳方法的讨论,至少两次。我所说的是 CodeProject 的论坛脚本在消息预览模式下所具有的功能。除了显示消息主题列表或文档名称(更通用的情况)之外,您还希望让用户能够预览消息或文档的内容。

这是一项非常有用的功能,因为它能让用户更好地了解每条消息(文档),并且在大多数情况下能阻止用户仅仅为了了解更多信息而点击每项内容。因此,它不仅对用户来说很方便,还能减少到您的 Web 服务器的请求数量。

“Left”解决方案或“快速而粗糙”

所以我们决定文档预览是我们想要采用的方式。我们该如何做到这一点?
首先想到的是 VBScript 自带的 Left() 函数。假设我们想将文档预览部分的大小限制为 500 个字符。

' Show first 500 characters of the text
Response.Write Left( strText, 500 )

这再简单不过了,性能也非常快,但它也有一个缺点——它不够友好。我的意思是,在哪里能看到友好的“...”来告诉用户我们显示的内容还有更多?
这很容易解决

' Show first 500 characters of the text
Response.Write Left( strText, 496 ) & " ..."
您注意到我使用了 496 而不是 500 作为 Left() 的第二个参数了吗?嗯,我们决定总共只显示 500 个字符,所以我们最好坚持这一点。:-)
现在又来了下一个问题:如果其中一个文档只有 200 个字符呢?我们友好的“...”现在变得不那么友好了。用户点击文档想阅读更多内容,却发现除了他/她已经看到的内容之外,没有任何其他东西了。幸运的是,这个问题也容易解决。

' Check if size of text is within 500 chars limit
If Len(strText) > 500 Then
	' Show first 500 characters of the text
	Response.Write Left( strText, 496 ) & " ..."
Else
	' Show all the text
	Response.Write strText
End If

只剩下一个问题了。通过这种方法,您几乎总会在单词中间截断文本。我不知道您怎么想,但恕我直言,这看起来不好。所以本文的其余部分将告诉您如何解决这个问题。

“Right”解决方案以及我为什么永远不会使用它

最近有人在几个 ASP 网站上发布了一篇关于这个相同问题的文章。作者称他的解决方案是获取文本第一部分的“正确方法”。让我们看看提出的解决方案:

  1. 删除文本中的所有换行符(strTemp = Replace(strText, vbCrLf, ""))。
  2. 检查文本长度是否小于您的限制。
  3. 如果小于——则不作更改地显示文本。
  4. 如果不是
    1. 获取文本在限制范围内的第一部分(strTemp = Left(strTemp, 500))。
    2. 创建文本中所有单词的数组(strTemp = Split(strTemp, " "))。
    3. 使用 For ... Next 循环将单词(不包括最后一个单词)添加到结果字符串中。
    4. 在结果字符串后追加“ ...”。

我不得不说,这个算法在大多数情况下都能正确工作。但就我而言,它存在以下几个问题:

  1. 创建一个单词数组,然后在循环中连接它们,这是一个非常缓慢、低效且消耗资源的进程。我已经做了一些性能测试,根据我处理的数据集,这个算法产生的结果比本文下面提出的解决方案慢 2 到 8 倍。
  2. 删除换行符只有在您用空格替换它们时才是个好主意。否则,您将面临将一行的最后一个单词与下一行的第一个单词连接起来的风险,中间没有任何空格。同时,整个步骤都可以跳过,因为浏览器无论如何都会忽略换行符,而我们可能丢失的只是几个有意义的字符。
  3. 如果文本在限制范围内没有空格(有人按键失灵)——您只会看到“ ...”。
  4. 无条件地在末尾追加“ ...”可能会产生比我们设定的限制更长的字符串。例如,如果第 500 个字符碰巧是一个空格,那么结果字符串将是 503 个字符长。如果您只是使用此函数显示文本,这可能不是什么大问题,但如果您决定使用此函数将预览存储到数据库……

在这里添加几个 If 语句可以解决上述一些问题。不幸的是,它无法解决这种方法的性能问题。这就是为什么我们应该寻找替代解决方案。

提出的解决方案

关于提出的解决方案的一些说明

  • 如果请求的字符数少于 5 个,TextPreview 函数将不会在末尾追加“ ...”。我很难想象为什么有人想要预览只有 4 个字符的文本,但我已经警告过您了。:-)
  • 如果在请求的“字符数”范围内未找到空格——它将以(“字符数” - 4)截断文本,并在其后追加“ ...”。
  • 如果您想将所有换行符替换为空格,则需要取消注释函数中的第一行代码。这只有在您的预览相对较大或您预期文本中有大量换行符时才有用。

这是您如何使用此函数

' Show first 200 characters of the text, whole words if possible
Response.Write TextPreview( strText, 200 )

这是函数本身

' TextPreview function 
'
' Returns first portion of the text up to nChars characters
' Returns only whole words when possible
'
' strText - text
' nChars - number of characters to limit preview to
'
Function TextPreview(strText, nChars)
	Dim nPos

    	' Uncomment next line to replace line breaks with spaces
	' strText = Replace(strText, vbCrLf, " ")

	' Check if it's longer than limit
    	If Len(strText) > nChars And nChars > 4 Then
        	' Find the end of last whole word that we can use
        	nPos = InStrRev(Left(strText, nChars - 3), " ")

        	If nPos > 0 Then
			' Take whole words only 
            		TextPreview = Left(strText, nPos) & "..."
        	Else
			' No spaces were found - take what we can
            		TextPreview = Left(strText, nChars - 4) & " ..."
	        End If
    	Else
		' Take nChars from the text
        	TextPreview = Left(strText, nChars)
    	End If
End Function
© . All rights reserved.