Try again

200512270453934121.gif

博客园 首页 联系 管理

格式化日期和数字的字符串经常要用到这个, 就把帮助里面的东西大概整理了一些列在这里了.

下表描述了用来格式化 DateTime 对象的标准格式说明符。
格式说明符 名称 说明
d 短日期模式 显示由与当前线程关联的 DateTimeFormatInfo.ShortDatePattern 属性定义的模式或者由指定格式提供程序定义的模式。
D 长日期模式 显示由与当前线程关联的 DateTimeFormatInfo.LongDatePattern 属性定义的模式或者由指定格式提供程序定义的模式。
t 短时间模式 显示由与当前线程关联的 DateTimeFormatInfo.ShortTimePattern 属性定义的模式或者由指定格式提供程序定义的模式。
T 长时间模式 显示由与当前线程关联的 DateTimeFormatInfo.LongTimePattern 属性定义的模式或者由指定格式提供程序定义的模式。
f 完整日期/时间模式(短时间) 显示长日期和短时间模式的组合,由空格分隔。
F 完整日期/时间模式(长时间) 显示由与当前线程关联的 DateTimeFormatInfo.FullDateTimePattern 属性定义的模式或者由指定格式提供程序定义的模式。
g 常规日期/时间模式(短时间) 显示短日期和短时间模式的组合,由空格分隔。
G 常规日期/时间模式(长时间) 显示短日期和长时间模式的组合,由空格分隔。
M 或 m 月日模式 显示由与当前线程关联的 DateTimeFormatInfo.MonthDayPattern 属性定义的模式或者由指定格式提供程序定义的模式。
R 或 r RFC1123 模式 显示由与当前线程关联的 DateTimeFormatInfo.RFC1123Pattern 属性定义的模式或者由指定格式提供程序定义的模式。这是定义的标准,并且属性是只读的;因此,无论所使用的区域性或所提供的格式提供程序是什么,它总是相同的。属性引用 CultureInfo.InvariantCulture 属性并遵照自定义模式“ddd, dd MMM yyyy HH:mm:ss G\MT”。请注意,“GMT”中的“M”需要转义符,因此它不被解释。格式化并不修改 DateTime 的值,所以您必须在格式化之前将值调整为 GMT。
s 可排序的日期/时间模式;符合 ISO 8601 显示由与当前线程关联的 DateTimeFormatInfo.SortableDateTimePattern 属性定义的模式或者由指定格式提供程序定义的模式。属性引用 CultureInfo.InvariantCulture 属性,格式遵照自定义模式“yyyy-MM-ddTHH:mm:ss”。
u 通用的可排序日期/时间模式 显示由与当前线程关联的 DateTimeFormatInfo.UniversalSortableDateTimePattern 属性定义的模式或者由指定格式提供程序定义的模式。因为它是定义的标准,并且属性是只读的,因此无论区域性或格式提供程序是什么,模式总是相同的。格式化遵照自定义模式“yyyy-MM-dd HH:mm:ssZ”。格式化日期和时间时不进行时区转换;所以,请在使用格式说明符之前将本地日期和时间转换为通用时间。
U 通用的可排序日期/时间模式 显示由与当前线程关联的 DateTimeFormatInfo.FullDateTimePattern 属性定义的模式或者由指定格式提供程序定义的模式。请注意,显示的时间是通用时间,而不是本地时间。
Y 或 y 年月模式 显示由与当前线程关联的 DateTimeFormatInfo.YearMonthPattern 属性定义的模式或者由指定格式提供程序定义的模式。
任何其他单个字符 未知说明符

下表描述了标准数字格式字符串。请注意,这些格式说明符产生的输出字符串受“区域选项”控制面板中的设置的影响。使用不同设置的计算机会生成不同的输出字符串。

格式说明符 名称 说明
C 或 c 货币 数字转换为表示货币金额的字符串。转换由用于格式化数字的 NumberFormatInfo 对象的货币格式信息控制。精度说明符指示所需的小数位数。如果省略精度说明符,则使用 NumberFormatInfo 给定的默认货币精度。
D 或 d 十进制 只有整型才支持此格式。数字转换为十进制数字 (0-9) 的字符串,如果数字为负,则前面加负号。精度说明符指示结果字符串中所需的最少数字个数。如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。
E 或 e 科学计数法(指数) 数字转换为“-d.ddd...E+ddd”或“-d.ddd...e+ddd”形式的字符串,其中每个“d”表示一个数字 (0-9)。如果该数字为负,则该字符串以减号开头。小数点前总有一个数字。精度说明符指示小数点后所需的位数。如果省略精度说明符,则使用默认值,即小数点后六位数字。格式说明符的大小写指示在指数前加前缀“E”还是“e”。指数总是由正号或负号以及最少三位数字组成。如果需要,用零填充指数以满足最少三位数字的要求。
F 或 f 固定点 数字转换为“-ddd.ddd...”形式的字符串,其中每个“d”表示一个数字 (0-9)。如果该数字为负,则该字符串以减号开头。精度说明符指示所需的小数位数。如果忽略精度说明符,则使用 NumberFormatInfo 给定的默认数值精度。
G 或 g 常规 根据数字类型以及是否存在精度说明符,数字会转换为固定点或科学记数法的最紧凑形式。如果精度说明符被省略或为零,则数字的类型决定默认精度,如下表所示。
Byte 或 SByte:3
Int16 或 UInt16:5
Int32 或 UInt32:10
Int64 或 UInt64:19
Single:7
Double:15
Decimal:29
如果用科学记数法表示数字时指数大于 -5 而且小于精度说明符,则使用固定点表示法;否则使用科学记数法。如果要求有小数点,并且忽略尾部零,则结果包含小数点。如果精度说明符存在,并且结果的有效数字位数超过指定精度,则通过舍入删除多余的尾部数字。使用科学记数法时,如果格式说明符是“G”,结果的指数带前缀“E”;如果格式说明符是“g”,结果的指数带前缀“e”。

上述规则有一个例外:如果数字是 Decimal 而且省略精度说明符时。在这种情况下总使用固定点表示法并保留尾部零。

N 或 n 数字 数字转换为“-d,ddd,ddd.ddd...”格式的字符串,其中每个“d”表示一个数字 (0-9)。如果该数字为负,则该字符串以减号开头。小数点左边每三个数字之间插入一个千位分隔符。精度说明符指示所需的小数位数。如果忽略精度说明符,则使用 NumberFormatInfo 给定的默认数值精度。
P 或 p 百分比 数字转换为由 NumberFormatInfo.PercentNegativePattern 属性或 NumberFormatInfo.PercentPositivePattern 属性定义的、表示百分比的字符串。如果数字为负,则产生的字符串由 PercentNegativePattern 定义并以负号开头。已转换的数字乘以 100 以表示为百分比。精度说明符指示所需的小数位数。如果省略精度说明符,则使用 NumberFormatInfo 给定的默认数值精度。
R 或 r 往返过程 往返过程说明符保证转换为字符串的数值再次被分析为相同的数值。使用此说明符格式化数值时,首先用常规格式测试:Double 使用 15 位精度,Single 使用 7 位精度。如果此值被成功地分析回相同的数值,则使用常规格式说明符对其进行格式化。但是,如果此值未被成功地分析为相同的数值,则它这样格式化:Double 使用 17 位精度,Single 使用 9 位精度。虽然精度说明符可以追加到往返过程格式说明符,但它将被忽略。使用此说明符时,往返过程优先于精度。此格式仅受浮点型支持。
X 或 x 十六进制 数字转换为十六进制数字的字符串。格式说明符的大小写指示对大于 9 的十六进制数字使用大写字符还是小写字符。例如,使用“X”产生“ABCDEF”,使用“x”产生“abcdef”。精度说明符指示结果字符串中所需的最少数字个数。如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。只有整型才支持此格式。

如果标准数字格式说明符未提供所需的格式化类型,可以使用自定义格式字符串进一步增强字符串输出。标准格式字符串包含一个字母字符,后面可能会跟有数字序列(形成一个 0 到 99 的值);而所有其他格式字符串都是自定义格式字符串。
下表显示可以用于创建自定义数字格式字符串及其定义的字符。请注意,与当前线程关联的 NumberFormatInfo 对象的“区域选项”控制面板的设置会影响这些字符中的某些所产生的输出字符串。使用不同区域性的计算机将生成不同的输出字符串。
格式字符值说明
0零占位符如果格式化的值在格式字符串中出现“0”的位置有一个数字,则此数字被复制到输出字符串中。小数点前最左边的“0”的位置和小数点后最右边的“0”的位置确定总在输出字符串中出现的数字范围。“00”说明符使得值被舍入到小数点前最近的数字,其中零位总被舍去。例如,用“00”格式化 34.5 将得到值 35。
#数字占位符如果格式化的值在格式字符串中出现“#”的位置有一个数字,则此数字被复制到输出字符串中。否则,输出字符串中的此位置不存储任何值。请注意,如果“0”不是有效数字,此说明符永不显示“0”字符,即使“0”是字符串中唯一的数字。如果“0”是所显示的数字中的有效数字,则显示“0”字符。“##”格式字符串使得值被舍入到小数点前最近的数字,其中零总被舍去。例如,用“##”格式化 34.5 将得到值 35。
.小数点格式字符串中的第一个“.”字符确定格式化的值中的小数点分隔符的位置;任何其他“.”字符被忽略。用作小数点分隔符的实际字符由控制格式化的 NumberFormatInfo 的 NumberDecimalSeparator 属性确定。
,千位分隔符和数字比例换算“,”字符有两种用途。首先,如果格式字符串在小数点(如果有)左边的两个数字占位符(0 或 #)之间包含“,”字符,则输出将在小数点分隔符左边的每三个数字之间插入千位分隔符。输出字符串中用作小数点分隔符的实际字符由控制格式化的当前 NumberFormatInfo 的 NumberGroupSeparator 属性确定。
其次,如果格式字符串在紧邻小数点的左侧包含一个或多个“,”字符,则数字在格式化之前将被“,”字符数除然后乘以 1000。例如,格式字符串“0,,”将 100,000,000 简单表示为 100。使用“,”字符指示比例换算在格式化数字中不包括千位分隔符。因此,若要将数字缩小 1,000,000 倍并插入千位分隔符,应使用格式字符串“#,##0,,”。
%百分比占位符在格式字符串中出现“%”字符将导致数字在格式化之前乘以 100。适当的符号插入到数字本身在格式字符串中出现“%”的位置。使用的百分比字符由当前的 NumberFormatInfo 类确定。
E0
E+0
E-0
e0
e+0
e-0科学计数法如果“E”、“E+”、“E-”、“e”、“e+”或“e-”中的任何一个字符串出现在格式字符串中,而且后面紧跟至少一个“0”字符,则数字用科学计数法来格式化,在数字和指数之间插入“E”或“e”。跟在科学计数法指示符后面的“0”字符数确定指数输出的最小位数。“E+”和“e+”格式指示符号字符(正号或负号)应总是置于指数前面。“E”、“E-”、“e”或“e-”格式指示符号字符仅置于负指数前面。
\转义符在 C# 和 C++ 的托管扩展中,反斜杠字符使格式字符串中的下一个字符被解释为转义序列。它与传统的格式化序列一起使用,如“\n”(换行)。
在某些语言中,转义符本身用作文本时必须跟在转义符之后。否则,编译器将该字符理解为转义符。使用字符串“\\”显示“\”。
请注意,Visual Basic 中不支持此转义符,但是 ControlChars 提供相同的功能。
'ABC'
"ABC"字符串引在单引号或双引号中的字符被原样复制到输出字符串中,而且不影响格式化。
;部分分隔符“;”字符用于分隔格式字符串中的正数、负数和零各部分。
其他所有其他字符所有其他字符以文本形式复制到输出字符串中它们出现的位置。

请注意,对于固定点格式字符串(不包含“E0”、“E+0”、“E-0”、“e0”、“e+0”或“e-0”的字符串),数字被舍入为与小数点右边的数字占位符数目相同的小数位数。如果格式字符串不包含小数点,数字被舍入为最接近的整数。如果数字位数多于小数点左边数字占位符的个数,多余的数字被复制到输出字符串中紧挨着第一个数字占位符的前面。
可以根据值为正、为负还是为零来为字符串应用不同的格式化。为产生这种行为,自定义格式字符串可以包含最多三个用分号分隔的部分:
一个部分:格式字符串应用于所有值。
两个部分:第一部分应用于正值和零,第二部分应用于负值。如果要格式化的数字为负,但根据第二部分中的格式舍入后为零,则最终的零根据第一部分进行格式化。
三个部分:第一部分应用于正值,第二部分应用于负值,第三部分应用于零。第二部分可能为空(分号间没有任何内容),在这种情况下,第一部分应用于所有非零值。如果要格式化的数字为非零值,但根据第一部分或第二部分中的格式舍入后为零,则最终的零根据第三部分进行格式化。
格式化最终值时,此类型的格式化忽略所有先前存在的与数字关联的格式化。例如,使用部分分隔符时,显示的负值永远不带负号。如果您希望格式化后的最终值带有负号,则应明确包含负号,让它作为自定义格式说明符的组成部分。下面的示例阐释如何使用部分分隔符产生格式化字符串。
[Visual Basic]
Dim MyPos As Double = 19.95

Dim MyNeg As Double = -19.95

Dim MyZero As Double = 0

Dim MyString As String = MyPos.ToString("$#,##0.00;($#,##0.00);Zero")

' In the U.S. English culture, MyString has the value: $19.95.

MyString = MyNeg.ToString("$#,##0.00;($#,##0.00);Zero")

' In the U.S. English culture, MyString has the value: ($19.95).
' The minus sign is omitted by default.

MyString = MyZero.ToString("$#,##0.00;($#,##0.00);Zero")

' In the U.S. English culture, MyString has the value: Zero.
[C#]
double MyPos = 19.95, MyNeg = -19.95, MyZero = 0.0;

string MyString = MyPos.ToString("$#,##0.00;($#,##0.00);Zero");

// In the U.S. English culture, MyString has the value: $19.95.

MyString = MyNeg.ToString("$#,##0.00;($#,##0.00);Zero");

// In the U.S. English culture, MyString has the value: ($19.95).
// The minus sign is omitted by default.

MyString = MyZero.ToString("$#,##0.00;($#,##0.00);Zero");

// In the U.S. English culture, MyString has the value: Zero.
下面的示例说明自定义数字格式化。
[Visual Basic]
Dim myDouble As Double = 1234567890
Dim myString As String = myDouble.ToString( "(###) ### - ####" )
' The value of myString is "(123) 456 – 7890".

Dim MyInt As Integer = 42
MyString = MyInt.ToString( "My Number " + ControlChars.Lf + "= #" )
' In the U.S. English culture, MyString has the value:
' "My Number
' = 42".
[C#]
Double myDouble = 1234567890;
String myString = myDouble.ToString( "(###) ### - ####" );
// The value of myString is "(123) 456 – 7890".

int MyInt = 42;
MyString = MyInt.ToString( "My Number \n= #" );
// In the U.S. English culture, MyString has the value:
// "My Number
// = 42".

------------------------------------------------------------------------------------------------

http://msdn.microsoft.com/library/dotnet/cpguide/cpconstandardnumericformatstrings.htm(这个是连接url)
Standard Numeric Format Strings are used to return commonly used numeric string types. They take the form X0, where X is the format specifier and 0 is the precision specifier. The format specifier can be one of the seven built-in format characters that define the most commonly used .NET Framework numeric format types. The precision specifier controls the number of significant digits or zeros to the right of a decimal.


Format character Description Default return format (without precision specifier)
C or c Currency format $XX,XX.XX
($XX,XXX.XX)

D or d Decimal format [-]XXXXXXX
E or e Scientific (exponential) format [-]X.XXXXXXE+xxx
[-]X.XXXXXXe+xxx

[-]X.XXXXXXE-xxx

[-]X.XXXXXXe-xxx

F or f Fixed-point format [-]XXXXXXX.XX
G or g General format Variable. Either general or scientific.
N or n Number format [-]XX,XXX.XX
X or x Hexadecimal format Variable. Returns the minimum hexadecimal representation.  


Currency Format
The "C" format specifier causes the Format method to return a string representing the number as a currency value. The currency symbols used (currency symbol, decimal separator, group separator, and so on) are determined by the current culture if a NumberFormatInfo object is not provided. An integer following the "C" determines the number of decimal places that are displayed. If no number is provided, two digits are shown after the decimal separator.

[C#]
int MyInt = 12345;

MyInt.format( "c", null );
// Returns the currency string "$12,345.00"

MyInt.format( "c3", null );
// Returns the exponential string "$12,345.000"
Decimal Format
The "D" format specifier converts the value from an integer to a base 10 (decimal) number. Only integral types support the "D" format code. A negative symbol is prefixed to the result if the value is negative. You can also specify the minimum number of decimal digits to display using a precision specifier.

[C#]
int MyInt = 123;

MyInt.format( "d5", null );
// Returns the decimal string "00123"

MyInt.format( "d2", null );
// Returns the decimal string "123"
Exponential Format
The “E” format specifier causes the Format method to return a string formatted as a scientific (or exponential) number. The precision specifier determines the number of digits after the decimal point. The case of the exponent format character ("E" or "e") determines the case of the exponent symbol.

[C#]
int MyInt = 12345;

MyInt.format( "e", null );
// Returns the exponential string "1.234500e+004"

MyInt.format( "e3", null );
// Returns the exponential string "1.235e+004"

Fixed Point Format
The "F" format specifier inserts a decimal to the right of a nondecimal number followed by the number of zeros specified by the precision specifier. If no precision specifier is supplied, two zeros will be inserted.

[C#]
int MyInt = 12345;

MyInt.format( "f", null );
// Returns the exponential string "12345.00"

MyInt.format( "f3", null );
// Returns the exponential string "12345.000"
General Format
The "G" format specifier converts a numeric value to either fixed point ("F") or scientific format ("E"). This specifier returns the most compact string representation for a given number.

[C#]
int MyInt = 12345;

MyInt.format( "g", null );
// Returns the exponential string "12345"

MyInt.format( "g3", null );
// Returns the exponential string "123e4"
Number Format
The "N" format specifier converts a numeric value to the form "[-]d,ddd,ddd.dd". A decimal is inserted at the far right of the number followed by the number of zeros specified by the format specifier. If no precision specifier is supplied, two zeros are inserted.

[C#]
int MyInt = 12345;

MyInt.format( "n", null );
// Returns the exponential string "12,345.00"

MyInt.format( "n3", null );
// Returns the exponential string "12,345.000"
Hexadecimal Format
The "X" format specifier converts a numeric value to a hexadecimal (base 16) string representation. The precision specifier determines the minimum number of digits returned. If no precision specifier is supplied, the minimum number of digits needed to represent the value is returned; otherwise, the number will be padded with zeros to meet the number of digits required by the precision specifier.

[C#]
int MyInt = 12345;

MyInt.format( "x", null );
// Returns the exponential string "3039"

MyInt.format( "x3", null );
// Returns the exponential string "3039"

posted @ 2006-04-27 21:41 andy 阅读(92) | 评论 (0)编辑 收藏

2006年4月18日 #

using System;
using System.Text.RegularExpressions;
 
namespace CommonTools
{
 /**//// <summary>
 /// RegexLib 的摘要说明。
 /// </summary>
 public class RegexLib
 {
 
 //验证Email地址
 public static bool IsValidEmail(string strIn)
 {
 // Return true if strIn is in valid e-mail format.
 return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
 }
 //dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。
 public static string MDYToDMY(String input)
 {
 return Regex.Replace(input,"\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b","${day}-${month}-${year}");
 }
 //验证是否为小数
 public static bool IsValidDecimal(string strIn)
 {
 return Regex.IsMatch(strIn,@"[0].\d{1,2}|[1]");
 }
 //验证是否为电话号码
 public static bool IsValidTel(string strIn)
 {
 return Regex.IsMatch(strIn,@"(\d+-)?(\d{4}-?\d{7}|\d{3}-?\d{8}|^\d{7,8})(-\d+)?");
 }
 //验证年月日
 public static bool IsValidDate(string strIn)
 {
 return Regex.IsMatch(strIn,@"^2\d{3}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[1-2]\d|3[0-1])(?:0?[1-9]|1\d|2[0-3]):(?:0?[1-9]|[1-5]\d):(?:0?[1-9]|[1-5]\d)$");
 }
 //验证后缀名
 public static bool IsValidPostfix(string strIn)
 {
 return Regex.IsMatch(strIn,@"\.(?i:gif|jpg)$");
 }
 //验证字符是否再4至12之间
 public static bool IsValidByte(string strIn)
 {
 return Regex.IsMatch(strIn,@"^[a-z]{4,12}$");
 }
 //验证IP
 public static bool IsValidIp(string strIn)
 {
 return Regex.IsMatch(strIn,@"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
 }
 
 }
}
posted @ 2006-04-18 01:37 andy 阅读(185) | 评论 (0)编辑 收藏

2006年4月16日 #

  1. 打开新的窗口并传送参数:
  
  传送参数:
  
  response.write("<script>window.open
  
  ('*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="++"')</script>")
  
  接收参数:
  
  string a = Request.QueryString("id");
  
  string b = Request.QueryString("id1");
  
  2.为按钮添加对话框
  
  Button1.Attributes.Add("onclick","return confirm('确认?')");
  
  button.attributes.add("onclick","if(confirm('are you sure?'))
  
  {return true;}else{return false;}")
  
  3.删除表格选定记录
  
  int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
  
  string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()
  
  4.删除表格记录警告
  
  private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
  
  {
  
  switch(e.Item.ItemType)
  
  {
  
  case ListItemType.Item :
  
  case ListItemType.AlternatingItem :
  
  case ListItemType.EditItem:
  
  TableCell myTableCell;
  
  myTableCell = e.Item.Cells[14];
  
  LinkButton myDeleteButton ;
  
  myDeleteButton = (LinkButton)myTableCell.Controls[0];
  
  myDeleteButton.Attributes.Add
  
  ("onclick","return confirm('您是否确定要删除这条信息');");
  
  break;
  
  default:
  
  break;
  
  }
  
  }
  
  5.点击表格行链接另一页
  
  private void grdCustomer_ItemDataBound
  
  (object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
  
  {
  
  //点击表格打开
  
  if (e.Item.ItemType == ListItemType.Item ||
  
  e.Item.ItemType == ListItemType.AlternatingItem)
  
  e.Item.Attributes.Add("onclick","window.open
  
  ('Default.aspx?id=" + e.Item.Cells[0].Text + "');");
  
  }
  
  双击表格连接到另一页,在itemDataBind事件中
  
  if(e.Item.ItemType == ListItemType.Item ||
  
  e.Item.ItemType == ListItemType.AlternatingItem)
  
  {
  
  string OrderItemID =e.item.cells[1].Text;
  
  
  
  e.item.Attributes.Add("ondblclick",
  
  "location.href='../ShippedGrid.aspx?id=" + OrderItemID + "'");
  
  }
  
  双击表格打开新一页
  
  if(e.Item.ItemType == ListItemType.Item ||
  
  e.Item.ItemType == ListItemType.AlternatingItem)
  
  {
  
  string OrderItemID =e.item.cells[1].Text;
  
  
  
  e.item.Attributes.Add("ondblclick",
  
  "open('../ShippedGrid.aspx?id=" + OrderItemID + "')");
  
  }
  
  ★特别注意:【?id=】 处不能为 【?id =】

 6.表格超连接列传递参数
  
  <asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id"
  NavigateUrl="aaa.aspx?id='<%# DataBinder.Eval(Container.DataItem, "数据字段1")%>'
   & name='<%# DataBinder.Eval(Container.DataItem, "数据字段2")%>' />
  
  7.表格点击改变颜色
  
  if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
  {
   e.Item.Attributes.Add("onclick","this.style.backgroundColor='#99cc00';
  this.style.color='buttontext';this.style.cursor='default';");
  }
  
  写在DataGrid的_ItemDataBound里
  
  if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
  {
   e.Item.Attributes.Add("onmouseover","this.style.backgroundColor='#99cc00';
  this.style.color='buttontext';this.style.cursor='default';");
  e.Item.Attributes.Add("onmouseout","this.style.backgroundColor='';this.style.color='';");
  }
  
  8.关于日期格式
  
    日期格式设定
  
  DataformatString="{0:yyyy-MM-dd}"
  
    我觉得应该在itembound事件中
  
  e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))
  
  9.获取错误信息并到指定页面
  
    不要使用Response.Redirect,而应该使用Server.Transfer
  
    e.g
  
  // in global.asax
  protected void Application_Error(Object sender, EventArgs e) {
   if (Server.GetLastError() is HttpUnhandledException)
   Server.Transfer("MyErrorPage.aspx");
  
  //其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了
  }
  
    Redirect会导致post-back的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理
  
  10.清空Cookie
  
  Cookie.Expires=[DateTime];
  Response.Cookies("UserName").Expires = 0
  11.自定义异常处理
  
  //自定义异常处理类
  using System;
  using System.Diagnostics;
  
  namespace MyAppException
  {
  /**//// <summary>
  /// 从系统异常类ApplicationException继承的应用程序异常处理类。
  /// 自动将异常内容记录到Windows NT/2000的应用程序日志
  /// </summary>
  public class AppException:System.ApplicationException
  {
   public AppException()
   {
   if (ApplicationConfiguration.EventLogEnabled)
   LogEvent("出现一个未知错误。");
   }
  
   public AppException(string message)
   {
   LogEvent(message);
   }
  
   public AppException(string message,Exception innerException)
   {
   LogEvent(message);
   if (innerException != null)
   {
   LogEvent(innerException.Message);
   }
   }
  
  //日志记录类
  using System;
  using System.Configuration;
  using System.Diagnostics;
  using System.IO;
  using System.Text;
  using System.Threading;
  
  namespace MyEventLog
  {
  /**//// <summary>
  /// 事件日志记录类,提供事件日志记录支持
  /// <remarks>
  /// 定义了4个日志记录方法 (error, warning, info, trace)
  /// </remarks>
  /// </summary>
  public class ApplicationLog
  {
   /**//// <summary>
   /// 将错误信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteError(String message)
   {
  
   WriteLog(TraceLevel.Error, message);
   }
  
   /**//// <summary>
   /// 将警告信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteWarning(String message)
   {
  
   WriteLog(TraceLevel.Warning, message);
   }
  
   /**//// <summary>
   /// 将提示信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteInfo(String message)
   {
   WriteLog(TraceLevel.Info, message);
   }
   /**//// <summary>
   /// 将跟踪信息记录到Win2000/NT事件日志中
   /// <param name="message">需要记录的文本信息</param>
   /// </summary>
   public static void WriteTrace(String message)
   {
  
   WriteLog(TraceLevel.Verbose, message);
   }
  /**//// <summary>
   /// 格式化记录到事件日志的文本信息格式
   /// <param name="ex">需要格式化的异常对象</param>
   /// <param name="catchInfo">异常信息标题字符串.</param>
   /// <retvalue>
   /// <para>格式后的异常信息字符串,包括异常内容和跟踪堆栈.</para>
   /// </retvalue>
   /// </summary>
   public static String formatException(Exception ex, String catchInfo)
   {
   StringBuilder strBuilder = new StringBuilder();
   if (catchInfo != String.Empty)
   {
   strBuilder.Append(catchInfo).Append("\r\n");
   }
   strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);
   return strBuilder.ToString();
   }
  
   /**//// <summary>
   /// 实际事件日志写入方法
   /// <param name="level">要记录信息的级别(error,warning,info,trace).</param>
   /// <param name="messageText">要记录的文本.</param>
   /// </summary>
   private static void WriteLog(TraceLevel level, String messageText)
   {
  
   try
   {
   EventLogEntryType LogEntryType;
   switch (level)
   {
   case TraceLevel.Error:
   LogEntryType = EventLogEntryType.Error;
   break;
   case TraceLevel.Warning:
   LogEntryType = EventLogEntryType.Warning;
   break;
   case TraceLevel.Info:
   LogEntryType = EventLogEntryType.Information;
   break;
   case TraceLevel.Verbose:
   LogEntryType = EventLogEntryType.SuccessAudit;
   break;
   default:
   LogEntryType = EventLogEntryType.SuccessAudit;
   break;
   }
  
   EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );
   //写入事件日志
   eventLog.WriteEntry(messageText, LogEntryType);
  
   }
   catch {} //忽略任何异常
   }
  } //class ApplicationLog
  }

12.Panel 横向滚动,纵向自动扩展
  
  <asp:panel style="overflow-x:scroll;overflow-y:auto;"></asp:panel>
  
  13.回车转换成Tab
  
  <script language="javascript" for="document" event="onkeydown">
  if(event.keyCode==13 && event.srcElement.type!='button' &&
  event.srcElement.type!='submit' && event.srcElement.type!='reset'
  && event.srcElement.type!=''&& event.srcElement.type!='textarea');
  event.keyCode=9;
  </script>
  
  onkeydown="if(event.keyCode==13) event.keyCode=9"
  
  http://dotnet.aspx.cc/exam/enter2tab.aspx
  
  14.DataGrid超级连接列
  
  DataNavigateUrlField="字段名" DataNavigateUrlformatString="http://xx/inc/delete.aspx?ID={0}"
  
  
  15.DataGrid行随鼠标变色
  
  private void DGzf_ItemDataBound
  (object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
   {
   if (e.Item.ItemType!=ListItemType.Header)
   {
   e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=
  \""+e.Item.style["BACKGROUND-COLOR"]+"\"");
   e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");
   }
   }
  
  16.模板列
  
  <ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID">
  <ITEMTEMPLATE>
   <ASP:LABEL text='<%# DataBinder.Eval(Container.DataItem,
  "ArticleID")%>' runat="server" width="80%" id="lblColumn" />
  </ITEMTEMPLATE>
  </ASP:TEMPLATECOLUMN>
  
  <ASP:TEMPLATECOLUMN headertext="选中">
  <HEADERstyle wrap="False" horizontalalign="Center"></HEADERstyle>
  <ITEMTEMPLATE>
   <ASP:CHECKBOX id="chkExport" runat="server" />
  </ITEMTEMPLATE>
  <EDITITEMTEMPLATE>
  <ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" />
  </EDITITEMTEMPLATE>
  </ASP:TEMPLATECOLUMN>
  
    后台代码
  
  protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
   {
   //改变列的选定,实现全选或全不选。
   CheckBox chkExport ;
   if( CheckAll.Checked)
   {
   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
   {
   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
   chkExport.Checked = true;
   }
   }
   else
   {
   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
   {
   chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
   chkExport.Checked = false;
   }
   }
   }
  17.数字格式化
  
  【<%#Container.DataItem("price")%>的结果是500.0000,怎样格式化为500.00?】
  <%#Container.DataItem("price","{0:¥#,##0.00}")%>
  int i=123456;
  string s=i.ToString("###,###.00");
  
  18.日期格式化
  
  【aspx页面内:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%>
  显示为: 2004-8-11 19:44:28
  我只想要:2004-8-11 】
  
  <%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%>
  
  应该如何改?
  
  
  【格式化日期】
  取出来,一般是object
  ((DateTime)objectFromDB).ToString("yyyy-MM-dd");
  
  【日期的验证表达式】
  A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31]
  
  ^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))
  [\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|
  ([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468]
  [1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]
  ?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|
  ([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))
  (\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))
  ([AM|PM|am|pm]{2,2})))?$
  
  B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03]
  
  ^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|
  (((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$
  
  【大小写转换】
  
  HttpUtility.HtmlEncode(string);
  HttpUtility.HtmlDecode(string)
  
  19.如何设定全局变量
  
    Global.asax中
    Application_Start()事件中
    添加Application[属性名] = xxx;
    就是你的全局变量
  
  20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?
  
    HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")
  
    【ASPNETMENU】点击菜单项弹出新窗口
    在你的menuData.xml文件的菜单项中加入URLTarget="_blank"
    如:
  
  <?xml version="1.0" encoding="GB2312"?>
  <MenuData ImagesBaseURL="images/">
   <MenuGroup>
   <MenuItem Label="内参信息" URL="Infomation.aspx" >
   <MenuGroup ID="BBC">
   <MenuItem Label="公告信息" URL="Infomation.aspx"
  URLTarget="_blank" LeftIcon="file.gif"/>
   <MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" />
  
  
    最好将你的aspnetmenu升级到1.2版

posted @ 2006-04-16 22:20 andy 阅读(62) | 评论 (0)编辑 收藏

2006年4月13日 #

昨天,Google 发布了我们在全球唯一的非英文品牌名称 – 谷歌。

顾名思义,以谷为歌,象征着耕耘和收获的喜悦,也表达了一种勤恳求实的态度。

有关起名的过程,很多媒体已做了详细的报导,就不想在这里有更多的描述。我只是想说,就像给自己的孩子起名字,每个 Google 的中国人都希望为 Google 起一个既符合品牌特点、又方便广大中文用户的名字。但是就像有太多的爸爸妈妈,每个人对 Google 品牌都有不同的诠释和期待,大家精益求精,起名字就成了一个漫长的过程。

在最后确定这两个字的时候,我们受到了梵高作品中对金黄色麦田 的描绘。梵高是一位极具创新精神、不同凡响的艺术家。他画中所描绘的广阔、金黄色的麦田好像蕴蓄着无尽的信息,我们在这里耕耘、创作,为用户收获结果。所以,以谷为歌,是我们的播种与期待之歌,也是收获与欢愉之歌。

“谷歌” 并不会代替 “Google” 英文名称的使用,这两个名字今后将相互呼应、互为支持。

一个名字的诞生,仅仅是我们更贴近中国用户的一步,我们今后的工作还会不断赋予它更丰富的含义。希望 “谷歌” 带着我们所有 googler 的理想开始它新的历程。
posted @ 2006-04-13 18:12 andy 阅读(124) | 评论 (0)编辑 收藏

2006年4月12日 #

什么是PageRank

Google等新一带搜索引擎的优势之一在于不仅索引量很大,而且还将最好的结果排在搜索结果的最前面,具体的原理可以参考Google の秘密 - PageRank 徹底解説一文,PageRank简单的说类似于科技论文中的引用机制:谁的论文被引用次数多,谁就是权威。在互联网上PageRank就是基于网页中相互链接关系的分析得出的。

此外,从计算方法角度阐述PageRank机制还有这篇文章:http://pr.efactory.de/里面有更详细的PageRank算法说明和各种清晰的小型个案分析:

比如:子页中导航条的重要性
B <=> A => C  
Vs  
B <=> A <=> C   (好)

页面数量因素:
B <=> A <=> C
Vs
F <=\   /=> G
B <=> A <=> C   (好)
D <=/   \=> E

一个意想不到的结论:
(B <=> A <=> C)      ( E <=> D <=> F)
Vs
(B <=> A <=> C)  <=> ( E <=> D <=> F)
PageRank升高的只是被链接的2个首页A和D,而网站子页面的PageRank平均会略有下降。同时:一个网站进入Google的索引量越大其受类似因素影响越小。
PageRank不对称的页面互链:
Google会用BadRank之类的算法进行纠正,而且一个网页着有来自“与其自身不相称”的高PageRank站点的链接,而自身又缺少足够数量和质量的反相链接的话,其PageRank会自动降低为0,A(pr=7) <=> B(pr=0)
简单的说就是:偶尔要被权威站点反相链接不算数,要被足够多的权威站点引用才能提高自身网页的PageRank。
Web超链分析算法综述(南京大学论文) 更多论文可以通过搜索:“filetype:pdf google pagerank anchor text bayesian”得到

链接就是一切

在互联网的海洋中,最重要的就是互联互通,不被其他网站引用的网站就是“信息孤岛”。“酒好也怕藏的深”,也许这话说起来有点像垃圾邮件广告,但事实就是这样。所以如果做网站的目的不是孤芳自赏,就需要积极的推广自己的网站。
通过搜索引擎推广自己需要注意以下几个方面:

  1. 以量取胜:不一定加入传统门户网站的分类目录才是网站推广,来自其他网站的任何反相链接都是有用的
    网站推广比较经典的方式就是加入比较大型门户网站的分类目录,比如:Yahoo!dmoz.org等。其实这里有一个误区:不一定非要加入大型网站的分类目录才是网站推广,因为现在搜索引擎已经不再只是网站目录的索引,而是更全面的网页索引,所以无论来自其他网站任何地方的反相链接都是非常有价值的,哪怕是出现在新闻报道,论坛,邮件列表归档中。Blogger(Weblog的简称)们也许最深刻地理解了“链接就是一切”这句话的含义,由于Blog的内容之间有大量的相互链接(他们之间利用RSS很容易进行链接大量传播),因此最经常被引用的Blog页面在搜索引擎中的排名往往比一些大型商业网站的页面还要高。而WIKI这样的文档管理系统更加突出了良好结构,良好引用的特征。而目前很多网站通过在各种WIKI/留言簿中灌注垃圾留言的方法,这种方式是非常不可取的。这种链接不稳定:
  2. 以质取胜:被PageRank高的网站引用能更快地提高PageRank
    数量只是关键因素之一,来自PageRank高的页面的链接还能更快的提高被链接目标的PageRank,我只是将一些文章投稿在了ZDNet中国上,由于页面上有文章出处链接,相应网页和网站整体的PageRank过了一段时间后就有了很大的提升。有时候被什么样的网站引用有时候比引用次数多更重要。这里我要特别感谢的是,当时ZDNet中国是唯一遵循了我的版权声明的要求表明了文章出处,并且有反相链接的网站。
    按照这个原则:能够名列Yahoo!和DMOZ这样的大型权威目录的头2层是非常有价值的。
  3. 了解搜索引擎的"价值观":
    Lucene简介这篇文章被Jakarta.apache.org的lucene项目引用以后,这篇文章就成为了所有页面中PageRank最高的页面,而Google支持的一些项目,比如:Folding@Home,让我一直怀疑他们对政府,教育和非盈利组织的站点有特别加分,毕竟.org .edu才代表了互联网的实质:分权和共享。
    但更合理的解释是:.org很多都是开放技术平台的开发者,他们会在首页这样的地方加入Powered By Apache, Power by FreeBSD之类的链接表示对其他开源平台的尊重,所以象Apache, PHP, FreeBSD这样的开源站点在GOOGLE中都有非常高的PageRank。而在.edu这些站点中,很多都是学术性比较强的文档,以超链接形式标明参考文献的出处已经成为一种习惯,而这也无疑正是PageRank最好的依据。
    注意:不要通过Link Farm提高自身的站点排名:Google会惩罚那些主动链接到Link Farm站点以提高自身排名站点,相应站点的页面将不会被收入到索引中。但如果你的页面被别的Link Farm链接了也不必担心,因为这种被动的链接是不会被惩罚的。
  4. 不要吝啬给其他网站的链接:如果一个网页只有大量的进入链接,而缺乏导出链接,也会被搜索引擎认为是没有价值的站点。保证你的网站能够帮助搜索引擎更准确地判断哪些是对用户最有价值的信息,也就是说如果你的网站只有外部反向链接而没有导出链接的话,也会对你的网站在搜索结果中的表现带来负面影响。当然网站中连一个导出链接都没有的情况非常罕见,除非你是刻意这么做。正常情况下大家都会自然地在网页中加上一些其他网站的链接,带领访问者去到我们认为重要或能够提供更多有价值信息的地方,

另外在推广自己网站之前也许首先需要了解自己网站目前在一些搜索引擎中的知名度,原理非常简单,可以参考如何评价网站的人气一文。

网站推广只是手段,如何突出内容、让需要相关信息的用户能够尽快的找到你的网站才是目的,PageRank高并不代表像Yahoo!这样的门户站点就能在所有搜索结果中排名靠前,因为搜索引擎的结果是搜索关键词在页面中的匹配度和页面的PageRank相结合的排名结果。因此第二个要点:如何突出关键词。

如何突出关键词:面向主题(Theme)的关键词匹配

  1.  Theme Engine正在逐步超过PR,成为结果排序中更主要的因素,可以比较一下以下现象:
    • 为什么查“新闻”,“汽车”之类的文字,各种门户网站的首页不在第一位?要知道他们的页面中都有相应频道的链接文字的
    • 一篇新闻页面中,搜索引擎如何不通过模板匹配,自动将新闻的主体和页面中的页头,栏目导航条,页尾等部分的内容区分开的?
    其实以上问题都可以归结为网页内容摘要的提取策略和关键词在其中的命中:
    首先将能够描述一个页面内容的分成以下几种类型:
    1. 链入文字描述:inbound link text
      http://www.searchenginedictionary.com/terms-inbound-link.shtml
    2. HTML页面标题:title 好标题一般会将页面中最重要的关键词放在最前面,比如:ABC-10型吸尘器 - XX家电城
    3. HTML内容主体:content text
    4. 链出文字:outbound link text
    如果按照以下规则:
    一个页面中关键词命中权重:链入文字 > HTML标题文字 > HTML页面主体内容 >> 出链文字,以上现象就比较好解释了。
    链入文字是页面上看不见的,但链入文字对被链接页面有巨大的作用:在现代搜索引擎在关键词匹配的过程中,匹配的过程不只看当前页面的内容摘要:很大程度上,不只看这个网页自己说自己有什么内容,还要看别人如何链接时,如何描述你的网站别人怎么称呼你,比你自己说自己更重要。。
    比如查:“世界卫生组织”,返回结果中有 http://www.who.int/ 而这个页面中是没有中文的,之所以能匹配上,是因为很多链接它的中文网站使用了:<a href="http://www.who.int/">世界卫生组织</a>,所以,这个页面中不存在的中文关键词也成为了页面摘要的一部分。这样一想,就可以知道链出链接的文字其实是为被链接的子频道首页或者内容详情页服务的。对自身页面的关键词密度只有负面的影响,这也是Google建议一个页面中链接不要超过100个的原因:他根本不索引100个链接以后的内容。按照以上规则,搜索引擎将一篇新闻详情页中的新闻内容提取出来就是把页面上所有带HTTP链接的文字都去掉,就是新闻的内容部分了,更精确一些可以通过取最长文本段落等策略实现;而很多网站首页或频道首页中几乎全部都是链接,经过搜索引擎分析的结果就是:什么内容也没有,能够被命中的关键词仅仅是别人链接你用的“网站首页”和频道标题Title中的站点名称等的几个关键词,而页面中其他的文字则远远不如相应子频道和具体内容页面的匹配度高,而搜索引擎能够通过以上规则,让用户更快的直接定位到有具体内容的内容详情页面。因此希望通过一个首页,尽可能多的命中所有希望推广的关键词是不可能的。让网页尽可能多的进入搜索引擎的索引,然后把握好整个网站的主题风格是非常重要的,让网站的主题关键词能够比较均匀的按照金字塔模式分布到网站中可以参考:网站的主题金字塔设计          网站名称(用户通过1-2个抽象关键词)
             /       \
        子频道1   子频道2 (用户通过2-3个关键词命中)
       /    \      /    \
    产品1  产品2 文章1 文章2 (用户通过3-4个关键词命中:这种用户最有价值)

  2. 不要空着标题:空着<title></title>无异于浪费了最有价值的一块阵地;
    不要使用meta keywords/description
    传统的页面中,HTML页面中会有类似以下的隐含信息,用于说明当前网页的主要内容关键字:
    <header>
        <meta name="keyword" content="mp3 download music...">
    </header>
    后来由于这种人工添加关键词的方式被滥用,大量网页中为了提高被搜索引擎命中的概率,经常添加一些和实际网页内容无关的热门关键比如:“music mp3 download”等,所以新一代的搜索引擎已经不再关心页面头文件中的人工meta keyword声明,而页面标题在搜索引擎的关键词的命中命中过程中往往有着更高的比重,如果一个关键词在标题中命中会比在页面中命中有更高的得分,从而在相应的搜索结果排名中更靠前。
  3. 标题长度和内容:不要过长,一般在40个字(80个字节)以内,并充分突出关键词的比重;
    如果更长的标题搜索引擎一般会忽略掉,所以要尽可能将主要关键词放在标题靠前的位置。省略掉不必要的形容词吧,毕竟用户主要通过名词来找到需要的内容。标题内容:尽量用一些别人可以通过关键词找到的字眼(也别太过头,如果标题中的字眼超过1半内容中都没有,有可能被搜索引擎排除出索引),因此基于web日志中来自其他搜索引擎的关键词查询统计非常必要。
  4. 如果网页很多的话,尽量使用不同的网页标题,争取让自己网站的内容更多的进入搜索引擎索引范围;
    因为搜索引擎会根据页面内容的相似度把一些内容当成重复页面排除出索引范围;
  5. 除了<title></title>外,还可以用<h1></h1>标题行突出内容主题,加强标题的效果;
    在我的网站设计中:我会把用<h1>[标题]</h1>这样的模板把标题突出显示,而不是通过改变字体的方式突出标题。

其他网站设计提示

  1. 静态链接:Blog网站另外一个优势在于其网页是静态链接:动态网页占到整个互联网内容的90%以上。各个搜索引擎其实能够表现的都只不过是互联网的冰山一角(3-5%),不同的只是谁让优质网页排名靠前的策略更优秀而已:大部分搜索引擎都认为静态链接的网页是优质网页,Google在优先抓取索引的网页中70%以上是不带参数链接的静态网页。而且即使同样的内容,静态网页也会比动态网页权重高:很容易理解:query?a=1&b=2这样的链接由于参数顺序颠倒的query?b=2&a=1完全相同。尽量使用静态网页:目前能够动态网页进行全面的索引还比较难,而即使是Google也更不会索引所有的内容,因此很少会对参数超过2个的动态网页进行进一步的抓取和分析。以下是一个phpBB论坛页面返回的HTTP头信息:
    HTTP/1.1 200 OK
    Date: Wed, 28 Jan 2004 12:58:54 GMT
    Server: Apache/1.3.29 (Unix) mod_gzip/1.3.26.1a PHP/4.3.4
    X-Powered-By: PHP/4.3.4
    Set-Cookie: phpBB_data=a%3A0%3A%7B%7D; expires=Thu, 27-Jan-2005 12:58:54 GMT; path=/;
    Set-Cookie: phpBB_sid=09f67a83ee108ecbf11e35bb6f36fcec; path=/;
    Content-Encoding: gzip
    Cache-Control: private, pre-check=0, post-check=0, max-age=0
    Expires: 0
    Pragma: no-cache
    Connection: close
    Content-Type: text/html
    
    为了避免隐私问题:Googlebot可以通过对页面http header中的session id和session cookie进行一些甄别,这样很多需要认证信息的论坛内容就无法进入索引了。
    总体上说Google喜欢新的,静态的内容。因此无论从效率上讲还是方便搜索引擎收录:使用内容发布系统将网站内容发布成静态网页都是非常必要的,从某种程度上说google friendly = anonymous cache friendly。
     
  2. 能够进入Google索引的页面数量越多越好。用类似以下的脚本可以统计自己的网站被搜索引擎索引的情况。
    #!/bin/sh
    YESTERDAY=`date -d yesterday +%Y%m%d`
    # for FreeBSD: YESTERDAY=`date -v-1d +%Y%m%d`
    
    LOG_FILE='/home/apache/logs/access_log'
    
    grep -i Googlebot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.googlebot.txt
    grep -i baiduspider $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.baiduspider.txt
    grep -i msnbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.msnbot.txt
    grep -i inktomi $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.inktomi.txt
    grep -i openbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort |uniq -c | sort -rn > spider/$YESTERDAY.openbot.txt
        
  3. 网站目录结构要扁平,因为每深一级目录,PAGERANK降低1-2个档次。假设首页是3,其子可能目录就是1了,更深可能就无法列入评级范围了。
  4. 表现和内容的分离:“绿色”网页
    网页中的javascript和css尽可能和网页分离,一方面提高代码重用度(也方便页面缓存),另外一方面,由于有效内容占网页长度的百分比高,也能提高相关关键词在页面中的比重也增加了。总之,应该鼓励遵循w3c的规范,使用更规范的XHTML和XML作为显示格式便于内容更长时间的保存。
  5. 让所有的页面都有能够快速入口:站点地图,方便网页爬虫(spider)快速遍历网站所有需要发布的内容。如果首页就是用Flash或图片进入的话,无异于将搜索引擎拒之门外,除了UI设计的用户友好外,spider friendly也是非常重要的。
  6. 保持网站自身的健康:经常利用坏链检查工具检查网站中是否有死链。
  7. 保持网页内容/链接的稳定性和持久性:在搜索引擎索引中网页存在的历史也是一个比较重要的因素,而且历史比较久的网页被链接的几率越高。为了保证自己网页能够被比较持久的被其他网站的页面引用,如果自己网页中有链接更新时,最好能保留旧的页面并做好链接转向,以保持内容的连续性。要知道,把一个网站和内容在搜索引擎中的排名“培养”的很高是一件非常不容易的事情,谁都不希望好不容易自己的内容被别人找到了,点击却是“404 页面不存在”吧,因此站点管理员对自身站点error.log的分析也是非常必要的。
  8. 文件类型因素:Google有对PDF, Word(Power Point, Excel), PS文档的索引能力,由于这种文档的内容比一般的HTML经过了更多的整理,学术价值一般比较高,所以这些类型的文档天生就比一般的HTML类型的文档 PageRank要高。因此,对于比较重要的文档:技术白皮书,FAQ,安装文档等建议使用PDF PS等高级格式存取,这样在搜索结果中也能获得比较靠前的位置。
  9. 常常能发现门户站点的一条新闻往往比其他站点的首页排名还要靠前。因此一个站点总体PageRank提高了以后,往往自身一些并不重要的内容也会被同那些高PageRank的内容一起带入被搜索引擎优先查询的列表中。这样经常造成很多大的开发站点的邮件列表归档往往比其他站点的首页PageRank还要高。

知己知彼——站点访问统计/日志分析挖掘的重要性

网站设计不仅仅只是被动的迎合搜索引擎的索引,更重要是充分利用搜索引擎带来的流量进行更深层次的用户行为分析。目前,来自搜索引擎关键词统计几乎是各种WEB日志分析工具的标准功能,相信商业日志统计工具在这方面应该会有更强化的实现。WEB日志统计这个功能如此重要,以至于新的RedHat 8中已经将日志分析工具webalizer作为标准的服务器配置应用之一。

以Apache/webalizer为例,具体的做法如下:

  1. 记录访问来源:
    在Apache配置文件中设置日志格式为combined格式,这样的日志中会包含扩展信息:其中有一个字段就是相应访问的转向来源: HTTP_REFERER,如果用户是从某个搜索引擎的搜索结果中找到了你的网页并点击过来,日志中记录的HTTP_REFERER就是用户在搜索引擎结果页面的URL,这个URL中包含了用户查询的关键词。
  2. 在webalizer中缺省配置针对搜索引擎的统计:如何提取HTTP_REFERER中的关键词
    webalizer中缺省有针对yahoo, google等国际流行搜索引擎的查询格式:这里我增加了针对国内门户站点的搜索引擎参数设置
    SearchEngine yahoo.com p=
    SearchEngine altavista.com q=
    SearchEngine google.com q=
    SearchEngine    sina.com.cn word=
    SearchEngine    baidu.com   word=
    SearchEngine    sohu.com    word=
    SearchEngine    163.com q=

通过这样设置webalizer统计时就会将HTTP_REFERER中来自搜索引擎的URL中的keyword提取出来,比如:所有来自 google.com链接中,参数q的值都将被作为关键词统计下来:,从汇总统计结果中,就可以发现用户是根据什么关键词找到你的次数,以及找到你的用户最感兴趣的是那些关键词等,进一步的,在webalizer中有设置还可以将统计结果倒出成CSV格式的日志,便于以后导入数据库进行历史统计,做更深层次的数据挖掘等。

以前通过WEB日志的用户分析主要是简单的基于日志中的访问时间/IP地址来源等,很明显,基于搜索引擎关键词的统计能得到的分析结果更丰富、更直观。因此,搜索引擎服务的潜在商业价值几乎是不言而喻的,也许这也是Yahoo! Altavista等传统搜索引擎网站在门户模式后重新开始重视搜索引擎市场的原因,看看Google的年度关键词统计就知道了,在互联网上有谁比搜索引擎更了解用户对什么更感兴趣呢?

请看反相链接统计:
需要注意的是:由于Google针对Windows 2000中的IE使用的是UTF-8方式的编码,因此很多统计有时候需要在UTF-8方式下查看才是正确字符显示。从统计中能够感受到:在使用水平比较高的IT开发人员中Google已经成为最常用的搜索引擎。而使用百度的用户也已经大大超过了传统的搜狐,新浪等门户站点,因此传统门户网站在搜索引擎上的优势将是非常脆弱的。而从技术的发展趋势来看,以后还会有更多的利用互联网媒体做更深层次数据挖掘的服务模式出现:

转载自cnblog.org——“突发”文字可能揭示社会趋势

在“新科学家”(New Scientist)在线杂志上,公布了康奈尔大学的一个新研究成果,引人注目,也许与Google 收购Pyra 的动机有关。

这所大学的计算机科学家 Jon Klenberg 开发了一个计算机算法,能够识别一篇文章中某些文字的“突发”增长,而且他发现,这些“突发”增长的文字可以用来快速识别最新的趋势和热点问题,因此能够更有效地筛选重要信息。过去很多搜索技术都采用了简单计算文字/词组出现频率的方法,却忽略了文字使用增加的速率。

Jon 特别指出,这种方法可以应用到大量Weblog上,以跟踪社会趋势,这对商业应用也很有潜力。例如,广告商可以从成千上万的个人Blog 中快速找到潜在的需求风尚。而且只要Blog 覆盖话题范围足够大(实际上发展趋势确实如此),这项技术对政治、社会、文化和经济等领域也都会有实际意义了。

虽然Google 新闻的内部算法至今没有公开,但是人们猜测这种完全由机器所搜集的头条新闻应当不是Google搜索引擎中惯用的鸽子算法,很可能与这种“突发”判断算法有关。如此说来,Google收购Blog工具供应商的举动确实还有更深层次的远见了。

- NewScientist.com news, Word 'bursts' may reveal online trends
- 还没有写完这些介绍,在 SlashDot 上也看到了很多有关这个发现的讨论

附:Google官方的站点设计指南

  • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.  让网站有着清晰的结构和文本链接,所有的页面至少要有一个静态文本链接入口
    批注:尽量不要用图片和JAVASCRIPT
  • Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages.
    为用户提供一个站点地图:转向网站的重要部分。如果站点地图页面超过100个链接,则需要将页面分成多个页面。
    批注:索引页不要超过100个链接:SPIDER只考虑页面中头100个链接
  • Create a useful, information-rich site and write pages that clearly and accurately describe your content.
    用一些有用的,信息量丰富的站点,清晰并正确的描述你的信息。
  • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.
    想像用户可能用来找到你的关键词,并保证这些关键词在网站中出现。
    批注:少用“最大”,“最好”之类的形容词,用用户最关心的词,比如:下载,歌星名字,而不是一些抽象名词。
  • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images.
    尽可能使用文本,而不是图片显示重要的名称,内容和链接。GOOGLE的机器人不认识图片中的文字。
  • Make sure that your TITLE and ALT tags are descriptive and accurate.
    保证:页面的TITLE和ALT标记正确的精确描述
  • Check for broken links and correct HTML.
    检查坏链并修正这些HTML错误。
  • If you decide to use dynamic pages (i.e., the URL contains a '?' character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them small.
    如果你打算使用动态页面:链接中包含"?",必须了解:并非所有的搜索引擎的机器人能想对待静态页面一样对待动态页面,保持动态页面的参数尽可能的少也会很有帮助。
  • Keep the links on a given page to a reasonable number (fewer than 100).
    让一个页面中的链接少于100个。

搜索引擎的宗旨在于提取互联网中质量最好的内容提供给用户,任何有利于帮助用户获得相对公正,优质内容的策略都是搜索引擎追求目标。PageRank是一个非常好的策略,但是并非所有策略都是基于非常复杂的算法。
从搜索引擎看来什么是互联网中“好”的内容呢?

  • 首先:互联网大约是8G个网页,而且以每天2M的速度增长的。其中80%以上是动态网页,而占总量20%的静态网页就是一个相对比较简单的过滤规则。
  • 其次:用户友好(User friendly)也是很重要的方面,搜索引擎利用算法帮助提升这些优质网站,包括:通过CSS将内容和表现分离:较少的javascript和frame结构,spider本身也很难深入抓取这些网页:Javascript和frame结构大部分是广告。
  • 标题明确:无标题,重复标题或者标题SPAM(类似于:游戏游戏游戏游戏游戏游戏这样的标题)进行过滤或降低得分页面大小:因为页面过大会导致用户下载缓慢,所以很多引擎只计算页面大小在100k以内的网页。
  • 链接引用:不仅需要有链接链入,也需要帮助用户找到其他更有价值的内容;
  • 文件类型:PDF和DOC等专业文档和来自edu,gov等非赢利网站的内容;
  • 链入网站的文字:所有用户不可见的因素全部被忽略。此外:用户搜索的行为本身也被Google记录,可能对目标网站的主题相关度有帮助。
posted @ 2006-04-12 09:05 andy 阅读(73) | 评论 (0)编辑 收藏

2006年3月30日 #

Google本周三宣布,该公司已同AOL达成最终协议,将投资10亿美元收购AOL 5%股份。

  根据Google向美国证券交易委员会提交的文件,该公司已于3月24日同AOL达成最终协议。去年底,Google宣布将以10亿美元的价格收购时代华纳AOL部门5%股份,当时双方预计交易将于今年3月底完成。但Google本月中旬宣布,将于今年第二季度完成交易,略晚于预期。

  去年12月,在AOL股份竞购战中,Google击败了主要竞争对手微软获得最终胜利。根据协议,Google将投资10亿美元收购AOL 5%的股份,并向AOL提供3亿美元的广告贷款,AOL可将这笔贷款用于竞购Google的搜索关键字广告。作为回报,Google可以通过AOL销售更多图片广告,进一步丰富其搜索引擎,并获取高额的利润。

  AOL是Goolge重要最大的合作伙伴。根据Google提交的2005年财报,该公司9%的营收,约为5.5亿美元,来自AOL网站广告。本周三,Google股价在纳斯达克上涨17.78美元,收于394.98美元,涨幅为4.7%。自上周五入选标准普尔500指数之后,Google股价在四个交易日里上涨了15.5%。

posted @ 2006-03-30 12:32 andy 阅读(91) | 评论 (0)编辑 收藏

一网友账户失窃遭遇“恶作剧”,淘宝网称将对会员账户加强安全监管

  “一口气买了25个笔记本电脑?我是不是登陆错了哦?”昨日,市民彭先生登录陶宝网用自己的账号进行网上购物时差点没遭吓晕:根据“已买到的宝贝”清单记录,自己在3月19日到21日三天内向4个卖家购买了25个笔记本电脑和一部手机,总共价值近10万元!在与“卖家”和网站进行联系后,彭先生得知这一切都是黑客在搞鬼,悬着的心才落了下来。

  一周不上网竟成“大买家”

  “3500元/台的笔记本电脑就买了12台,其余13台3000——4000元不等,APPLE、三星、索尼、戴尔,几乎所有品牌都买齐了!”昨日,彭先生一边给记者展示“已买到的宝贝”记录清单一边摇头说:“别人肯定会以为我是笔记本电脑痴。”

  由于彭先生的账户在3天内交易量接近10万元,他几乎成了卖家炙手可热的抢夺对象,有数百卖家在“淘宝旺旺”(供买卖双方在线聊天的平台)中向他发布有关笔记本电脑广告。

  据彭先生介绍,事实上他已经一周没有登录这个账户了,他所有的财产加起来也没有这么多钱。彭说:“只有一个可能,我的账户密码被黑了。”

  卖家:“我也遭黑了!”

  由于有两个笔记本电脑交易状态已经显示出“等待卖家发货”,意味着已经付款,彭先生担心卖家发货后收不到钱会找自己扯皮,立即电话联系上了卖家周垒和夏斌。

  “卖电脑?发货?你说什么呢?我这段时间都在天津出差,根本没进淘宝!”原来周垒和夏斌都是浙江商人卢琳的网名,他异常愤怒的说:“淘宝到底怎么了?今天上午有网友质问我为什么在网上投诉他?也是问得我莫名其妙,现在你又说我卖电脑给你?我都好几天没碰过电脑了!”

  经过电话沟通,最后卖家卢琳得出的结论是:“我也遭黑了!”

  已有付款密码遭破译

  “重庆网友彭先生和浙江商人卢琳目前遭遇的情况应该是账户被盗用。”陶宝网客服中心工作人员否认了系统有问题,他告诉记者:“账户被盗对会员不会造成实际的经济损失,这可能是某个网友的恶作剧。我们已经对失窃的会员账户进行监管,相信不久就能抓住这个黑客。”

  彭先生表示:“淘宝支付宝是为买卖双方提供交易的网罗平台,号称是最安全的网上交易平台,但现在既然有人能破译登录账户密码,我们真的很担心用于资金过户的支付宝密码的安全。”

  彭先生的担心并非多余,记者通过自己的账户登录陶宝网,在社区中看到一条北京网友群发的警惕信息称,有人通过一个邮箱在淘宝黑了几个人的支付宝密码,用支付宝中的资金买他的东西,交易了40多笔。

  为了保险起见,昨日彭先生已紧急将自己专门用于陶宝网购物付钱的银行账户清空,同时将支付宝密码改成16位。

posted @ 2006-03-30 12:31 andy 阅读(141) | 评论 (0)编辑 收藏

晨报讯 (记者 张旭光) 中国市场日益胶着的竞争态势,令全球电子商务巨头eBay终于失去耐心,开始用雷霆手段对付淘宝等日益增多的本土厂商。eBay在中国的主要军团eBay易趣昨天宣布,推出“免费开店”等价格调整计划,为网上卖家开辟一条“零成本销售渠道”,整个计划实际上是一次凶悍的价格战。

  据悉,eBay易趣此次调价计划将从今天起正式开始实施,价格调整内容包括:任何经过认证的用户都可以免费在eBay易趣开店;以仓储式登录店铺商品将无须支付任何登录费用;所有仓储式商品将与竞价商品和定价商品一样,在eBay易趣的主搜索结果中显示;所有定价商品的登录费下调至和竞价商品相同,最低至每个商品一毛钱登录费。

  有证据表明,eBay中国的全面调价计划得到了美国总部的全力支持,类似降价举动在eBay的其他市场上从未发生过。eBay易趣甚至已同意免收用户每月前3条商品的登录费,对通过“安付通”及“贝宝”等网络支付工具付款的用户,则免收成交后的交易手续费。

  今年以来,淘宝网与腾讯的拍拍网都在以“免费”为招牌对eBay中国施加压力,而通过该轮价格调整,淘宝网、拍拍网等本土对手的价格优势将被极大遏制。

  eBay易趣公司发言人刘薇昨天否认调价是迫于对手压力,“eBay易趣的店铺模式已被国内不少企业借鉴,但是我们店铺功能的丰富和高效在国内仍是首屈一指的,此次取消开店费的目的在于鼓励职业卖家开店,让他们有机会尝试,帮助他们降低销售成本”。

posted @ 2006-03-30 12:29 andy 阅读(72) | 评论 (0)编辑 收藏

微软将于4月11日发布最新IE浏览器安全补丁,安装补丁之后网民将会发现浏览器有许多与往常不同的地方,微软将对Flash或QuickTime等动态内容的显示进行调整,这一调整的主要原因是微软与Eolas Technologies公司在相关专利技术上存在争议。

  据Pcworld网站报道,微软已在IE的临时补丁中作了改动,但4月11日的最新补丁发布后将在IE中强制运行。微软安全应急中心安全项目经理斯蒂芬·图卢兹表示:“目前的临时补丁尚处于测试阶段,因此还不是最终版本。”

  有关新补丁的发布日期微软自己还没有最终确定,本周早些时候,微软客户支持集团发布通知称,新补丁将于4月11日发布,但该通知随后又被撤除,图卢兹称日期还没有最终敲定。

  2003年3月,伊利诺斯州一家法院判处微软侵犯专利,向Eolas赔偿5.21亿美元。尽管微软不服判决并提起了上诉,同时提请美国专利局对Eolas专利的有效性进行裁决,但法院的判决也迫使微软对IE做出修正,以防止落下藐视法庭的罪名。

  ActiveX插件将改变网民与一些动态内容的交流方式,迫使他们在打开Flash或QuickTime内容之前点击一下弹出工具栏。微软、苹果电脑及Adobe系统公司已发布了有关该插件代码,运行该代码网站的显示与以往一样。

  旧金山VelocIT公司Web开发者乔恩·盖洛维表示,但有大多数网站并未立即更新Flash,因此其显示情形多少会让用户感到意外。他表示,IE此次更新受累最多的要数Web开发者,他们要急于安装这些代码,并且大多要通过手动安装。

posted @ 2006-03-30 12:22 andy 阅读(85) | 评论 (0)编辑 收藏

2006年3月7日 #

mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法

shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client

官方的说法是

MySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. .....


 

如果你升级mysql到4.1以上版本后遇到以上问题,请先确定你的mysql client 是4.1或者更高版本.(WINDOWS下有问题你就直接跳到下面看解决方法了,因为MYSQL 在WINDOWS是client和server一起装上了的)

请使用以下两种方法之一

其一:

mysql> SET PASSWORD FOR
    -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');

其二:

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
    -> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;
上面红色的部分请按自己实际情况修改....
这样做后,连接就会正常了@!

posted on 2006-06-26 15:07  共同学习,共同进步  阅读(4846)  评论(0编辑  收藏  举报