竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


263月/100

PHP中文件读写操作

发布在 邵珠庆

以下为文件读写操作的 基本PHP函数及模式(看不明白就记住他)

关于模式:
'r' - 只读方式打开, 文件指针置于文件头
'r+' - 读写方式打开,文件指针置于文件头
'w' - 只写打开,文件指针置于文件头, 文件被剪切为0字节, 如果文件不存在, 尝试建立文件
'w+' - 读写打开,文件指针置于文件头, 文件大小被剪切为0字节,如果文件不存在, 尝试建立文件
'a' - 只写方式打开,文件指针置于文件尾,如果文件不存在,尝试建立文件
'a+' - 读写打开,文件指针置于文件尾,如果文件不存在, 尝试建立文件
fgets —  从文件指针中读取一行
fgetss — 从文件指针中读取一行并过滤掉 HTML 标记
file — 把整个文件读入一个数组中
fgetcsv — 从文件指针中读入一行并解析 CSV 字段

你一定用过“网络硬盘”吧,利用它可以按自己的需要新建文件夹来分门别类地把自己的一些文件保存起来,有的还可以在线编辑文件。

PHP中提供了一系列的I/O函数,能简捷地实现我们所需要的功能,包括文件系统操作和目录操作(如“复制[copy]”)。下面给大家介绍的是基本的文件读写操作:(1)读文件;(2)写文件;(3)追加到文件。

TEXT 代码:

  1. 作者: Mukul
  2. 翻译: 无伤 <goghs@mail.com>

读文件:

  1. <?php
  2. $file_name="data.dat";
  3. // 要读取的文件的绝对路径: homedata.dat
  4. $file_pointer=fopen($file_name,"r");
  5. // 打开文件,"r" 是一种模式,或者说我们要进行的操作方法,详见本文后面的介绍
  6. $file_read=fread($file_pointer,filesize($file_name));
  7. // 通过文件指针读取文件内容
  8. fclose($file_pointer);
  9. // 关闭文件
  10. print"读取到的文件内容是: $file_read";
  11. // 显示文件内容
  12. ?>

写文件:

  1. <?php
  2. $file_name="data.dat";
  3. // 绝对路径: homedata.dat
  4. $file_pointer=fopen($file_name,"w");
  5. // "w"是一种模式,详见后面
  6. fwrite($file_pointer,"what you wanna write");
  7. // 先把文件剪切为0字节大小, 然后写入
  8. fclose($file_pointer);
  9. // 结束
  10. print"数据成功写入文件";
  11. ?>

追加到文件后面:

  1. <?php
  2. $file_name="data.dat";
  3. // 绝对路径: homedata.dat
  4. $file_pointer=fopen($file_name,"a");
  5. // "w"模式
  6. fwrite($file_pointer,"what you wanna append");
  7. // 不把文件剪切成0字节, 把数据追加到文件最后
  8. fclose($file_pointer);
  9. // 结束
  10. print"数据成功追加到文件";
  11. ?>

以上只是简单介绍,下面我们要讨论一些更深层的。

有时候会发生多人写入的情况(最常见是在流量较大的网站),会产生无用的数据写入文件, 例如:

info.file文件内容如下 ->

|1|Mukul|15|Male|India (n)
|2|Linus|31|Male|Finland (n)

现在两个人同时注册,引起文件破坏->

info.file ->

|1|Mukul|15|Male|India
|2|Linus|31|Male|Finland
|3|Rob|27|Male|USA|
Bill|29|Male|USA

上例中当PHP写入Rob的信息到文件的时候,Bill正好也开始写入,这时候正好需要写入Rob纪录的'n',引起文件破坏。

我们当然不希望发生这样的情况, 所以让我们看看文件锁定:

复制内容到剪贴板

PHP 代码:
  1. <?php
  2. $file_name="data.dat";
  3. $file_pointer=fopen($file_name,"r");
  4. $lock=flock($file_pointer, LOCK_SH);
  5. // 我使用4.0.2,所以用LOCK_SH,你可能需要直接写成 1.
  6. if($lock){
  7. $file_read=fread($file_pointer,filesize($file_name));
  8. $lock=flock($file_pointer, LOCK_UN);
  9. // 如果版本小于PHP4.0.2, 用 3 代替 LOCK_UN
  10. }
  11. fclose($file_pointer);
  12. print"文件内容为 $file_read";
  13. ?>

上例中,如果两个文件read.php和read2.php都要存取该文件,那么它们都可以读取,但是当一个程序需要写入的时候,它必须等待,直到读操作完成,文件所释放。

  1. <?php
  2. $file_name="data.dat";
  3. $file_pointer=fopen($file_name,"w");
  4. $lock=flock($file_pointer, LOCK_EX);
  5. // 如果版本低于PHP4.0.2, 用 2 代替 LOCK_EX
  6. if($lock){
  7. fwrite($file_pointer,"what u wanna write");
  8. flock($file_pointer, LOCK_UN);
  9. // 如果版本低于PHP4.0.2, 用 3 代替 LOCK_UN
  10. }
  11. fclose($file_pointer);
  12. print"数据成功写入文件";
  13. ?>

虽然"w"模式用来覆盖文件, 单我觉得不适用。

  1. <?php
  2. $file_name="data.dat";
  3. $file_pointer=fopen($file_name,"a");
  4. $lock=flock($file_pointer, LOCK_EX);
  5. // 如果版本低于PHP4.0.2, 用 2 代替 LOCK_EX
  6. if($lock){
  7. fseek($file_pointer,0, SEEK_END);
  8. // 如果版本小于PHP4.0RC1, 使用 fseek($file_pointer, filsize($file_name));
  9. fwrite($file_pointer,"what u wanna write");
  10. flock($file_pointer, LOCK_UN);
  11. // 如果版本低于PHP4.0.2, 用 3 代替 LOCK_UN
  12. }
  13. fclose($file_pointer);
  14. ?>

Hmmm..., 对于追加数据与其他操作有点不同,就是FSEEK! 确认文件指针在文件尾部总是一个好习惯。

如果是在Windows系统下, 上面的文件中文件名前面需要加上''.

213月/100

PHP抓取网页和分析

发布在 邵珠庆

<?PHP

//$url = "http://news.google.cn/news/section?pz=1&cf=all&ned=ccn&topic=i&ict=ln";
$url = "http://news.google.cn/news/section?pz=1&cf=all&ned=ccn&topic=t&ict=ln";
$lines_array = file($url);
$lines_string = implode('', $lines_array);

eregi('<head>(.*)</head>', $lines_string, $head1);
eregi('<table>(.*)</table>', $lines_string, $head2);
eregi('<div>(.*)</div>', $head2[0], $head3);
echo $head1[0];
echo $head3[0];

?>

 

译者:limodou
抓取和分析一个文件是非常简单的事。这个教程将通过一个例子带领你一步一步地去实现它。让我们开
始吧!

首先,我首必须决定我们将抓取的URL地址。可以通过在脚本中设定或通过$QUERY_STRING传递。为了简
单起见,让我们将变量直接设在脚本中。

<? $url = 'http://www.php.net'; ?>

第二步,我们抓取指定文件,并且通过file()函数将它存在一个数组里。

<? $url = 'http://www.php.net'; $lines_array = file($url); ?>

好了,现在在数组里已经有了文件了。但是,我们想分析的文本可能不全在一行里面。为了解决这个文
件,我们可以简单地将数组$lines_array转化成一个字符串。我们可以使用implode(x,y)函数来实现它。如
果在后面你想用explode(将字符串变量数组),将x设成"|"或"!"或其它类似的分隔符可能会更好。但是出于
我们的目的,最好将x设成空格。y是另一个必要的参数,因为它是你想用implode()处理的数组。

<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); ?>

现在,抓取工作就做完了,下面该进行分析了。出于这个例子的目的,我们想得到在<head>到</head>
之间的所有东西。为了分析出字符串,我们还需要叫做正规表达式的东西。

<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); ?>

让我们看一下代码。正如你所见,eregi()函数按下面的格式执行:

eregi("<head>(.*)</head>", $lines_string, $head);

"(.*)"表示所有东西,可以解释为,"分析在<head>和</head>间的所以东西"。$lines_string是我们正
在分析的字符串,$head是分析后的结果存放的数组。
最后,我们可以输数据。因为仅在<head>和</head>间存在一个实例,我们可以安全的假设数组中仅存
在着一个元素,而且就是我们想要的。让我们把它打印出来吧。

<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); echo $head[0]; ?>

这就是全部的代码了。

<?php

//获取所有内容url保存到文件
function  get_index ( $save_file ,  $prefix = "index_" ){
$count  =  68 ;
$i  =  1 ;
if ( file_exists ( $save_file )) @ unlink ( $save_file );
$fp  =  fopen ( $save_file ,  "a+" ) or die( "Open " .  $save_file  . " failed" );
while( $i < $count ){
$url  =  $prefix  .  $i  . ".htm" ;
echo  "Get " .  $url  . "..." ;
$url_str  =  get_content_url ( get_url ( $url ));
echo  " OK/n" ;
fwrite ( $fp ,  $url_str );
++ $i ;
}
fclose ( $fp );
}

//获取目标多媒体对象
function  get_object ( $url_file ,  $save_file ,  $split = "|--:**:--|" ){
if (! file_exists ( $url_file )) die( $url_file  . " not exist" );
$file_arr  =  file ( $url_file );
if (! is_array ( $file_arr ) || empty( $file_arr )) die( $url_file  . " not content" );
$url_arr  =  array_unique ( $file_arr );
if ( file_exists ( $save_file )) @ unlink ( $save_file );
$fp  =  fopen ( $save_file ,  "a+" ) or die( "Open save file " .  $save_file  . " failed" );
foreach( $url_arr  as  $url ){
if (empty( $url )) continue;
echo  "Get " .  $url  . "..." ;
$html_str  =  get_url ( $url );
echo  $html_str ;
echo  $url ;
exit;
$obj_str  =  get_content_object ( $html_str );
echo  " OK/n" ;
fwrite ( $fp ,  $obj_str );
}
fclose ( $fp );
}

//遍历目录获取文件内容
function  get_dir ( $save_file ,  $dir ){
$dp  =  opendir ( $dir );
if ( file_exists ( $save_file )) @ unlink ( $save_file );
$fp  =  fopen ( $save_file ,  "a+" ) or die( "Open save file " .  $save_file  . " failed" );
while(( $file  =  readdir ( $dp )) !=  false ){
if ( $file != "."  &&  $file != ".." ){
echo  "Read file " .  $file  . "..." ;
$file_content  =  file_get_contents ( $dir  .  $file );
$obj_str  =  get_content_object ( $file_content );
echo  " OK/n" ;
fwrite ( $fp ,  $obj_str );
}
}
fclose ( $fp );
}

//获取指定url内容
function  get_url ( $url ){
$reg  =  '/^http:////[^//].+$/' ;
if (! preg_match ( $reg ,  $url )) die( $url  . " invalid" );
$fp  =  fopen ( $url ,  "r" ) or die( "Open url: " .  $url  . " failed." );
while( $fc  =  fread ( $fp ,  8192 )){
$content  .=  $fc ;
}
fclose ( $fp );
if (empty( $content )){
die( "Get url: " .  $url  . " content failed." );
}
return  $content ;
}

//使用socket获取指定网页
function  get_content_by_socket ( $url ,  $host ){
$fp  =  fsockopen ( $host ,  80 ) or die( "Open " .  $url  . " failed" );
$header  =  "GET /" . $url  . " HTTP/1.1/r/n" ;
$header  .=  "Accept: */*/r/n" ;
$header  .=  "Accept-Language: zh-cn/r/n" ;
$header  .=  "Accept-Encoding: gzip, deflate/r/n" ;
$header  .=  "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)/r/n";
$header  .=  "Host: " .  $host  . "/r/n" ;
$header  .=  "Connection: Keep-Alive/r/n" ;
//$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-/r/n/r/n";
$header  .=  "Connection: Close/r/n/r/n" ;

fwrite ( $fp ,  $header );
while (! feof ( $fp )) {
$contents  .=  fgets ( $fp ,  8192 );
}
fclose ( $fp );
return  $contents ;
}

//获取指定内容里的url
function  get_content_url ( $host_url ,  $file_contents ){

//$reg = '/^(#|JavaScript.*?|ftp:////.+|http:////.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i';
//$reg = '/^(down.*?/.html|/d+_/d+/.htm.*?)$/i';
$rex  =  "/([hH][rR][eE][Ff])/s*=/s*['/"]*([^>'/"/s]+)[/"'>]*/s*/i" ;
$reg  =  '/^(down.*?/.html)$/i' ;
preg_match_all  ( $rex ,  $file_contents ,  $r );
$result  =  "" ;  //array();
foreach( $r  as  $c ){
if ( is_array ( $c )){
foreach( $c  as  $d ){
if ( preg_match ( $reg ,  $d )){  $result  .=  $host_url  .  $d . "/n" ; }
}
}
}
return  $result ;
}

//获取指定内容中的多媒体文件
function  get_content_object ( $str ,  $split = "|--:**:--|" ){
$regx  =  "/href/s*=/s*['/"]*([^>'/"/s]+)[/"'>]*/s*(.*?<//b>)/i" ;
preg_match_all ( $regx ,  $str ,  $result );

if ( count ( $result ) ==  3 ){
$result [ 2 ] =  str_replace ( "多媒体: " ,  "" ,  $result [ 2 ]);
$result [ 2 ] =  str_replace ( " " ,  "" ,  $result [ 2 ]);
$result  =  $result [ 1 ][ 0 ] .  $split  . $result [ 2 ][ 0 ] .  "/n" ;
}
return  $result ;
}

?>

193月/100

离职员工的期权处理

发布在 邵珠庆

前一段时间,有不少朋友问到:假如有员工从公司离职,员工手中的期权应当如何处理?近期,越来越多的创业公司也都面临着类似的问题,有的离职员工甚至要把公司告上法庭,看来非常有必要向公司和员工来分享一下关于离职员工的期权问题了。

公司与员工终止劳动关系时,除了终止理由和程序的合法性之外,还涉及到工资、奖金、社保、公积金、经济补偿、保密、知识产权、不竞争义务等等一系列法律问题。如果说这些问题都是惯常的法律问题,那么,随着股权激励在创业公司中越来越广泛的使用,期权已经成为一个越来越普遍的员工离职新问题,因为期权涉及的权益潜在价值较大,再加上缺少成熟的法律规范,公司和员工双方往往都容易被期权问题所困扰。

1、期权是什么?

期权,就是公司赋予员工在满足约定条件后按照特定价格购买公司股权(份)的期待权利,目的在于通过股权来招募、激励和留存优秀人才,这已经成为越来越多创业公司甚至上市公司采用的人才激励方式。这里的特定价格往往比其他投资人购买公司股权(份)的价格要低很多,体现了公司提供给员工的奖励和优惠。

是否行使手中的期权,是员工的权利,而不是义务。员工行使期权,应当按期权文件规定的条件和程序支付行权价格,取得公司股权(份),成为公司股东;员工不行使或放弃期权,则期权到期作废。

简法帮提示:

如果离职员工手中持有公司的期权,员工在离职时就需要权衡公司前景、行权的成本(包括行权价格和税负),是否愿意行使期权从而在离开公司后继续持有公司的股权?而公司方面则需要考虑:是否愿意让离职员工继续持有公司股权?是否有权通过回购等方式收回离职员工手中的期权或股权?能收回多少?需要多大成本?

2、离职员工有多少期权?

创业公司的期权方案中,行使期权的条件通常体现为服务期限。例如,市场主流为约定激励对象四年服务期,每满一年,员工可行使1/4的期权总额;当然,也有不少公司约定为四年服务期,第一年期满可行使1/4的期权总额,剩余3/4期权在三年(36个月)内按月到位,每月到位1/36。当然,也有公司将服务期约定为五年,每年1/5,与四年的道理相同。

这种分期到位(Vesting)的机制是从国外引入,已经成为国内创业公司员工激励的主流方式。但是,这些机制是体现在公司的期权激励文件中,包括激励方案和期权授予协议等文件,而不是在任何法律规章之中,所以公司和员工都需要查阅双方签署的激励文件,以文件的约定为准。

通常情况下,员工必须满一年才能取得相应的期权,员工未满一年离开公司的,按照期权方案规定通常不能行使期权。同样,这也是市场主流实践做法,但是最终都需要以双方签署的激励文件为准。

简法帮提示:

当离职员工涉及期权问题时,公司和员工双方要做的第一件事情,就是找出双方签署的期权授予协议以及相关激励方案等文件。这也是为什么创业者发给我们几个截图想要寻求帮助时,我们通常会给出的建议就是:要全面地查看激励文件。对于公司也是一样。

我们在实践中也注意到,有些创业公司自作聪明,不让员工持有或保存激励方案甚至授予协议。且不论这样的股权激励到底给员工什么样的印象(员工自己都不知道有什么权利义务),股权激励能否达到吸引、激励和留存优秀员工的效果,更重要的是,进入诉讼争议程序后,公司最后还是要提交相关文件,在公开案件中则有可能产生更大范围的负面声誉影响。

3、期权行使的时限

期权行使期限可以说是创业公司股权激励的一个“杀手锏”,基本意思就是,员工在离开公司时或之后的一个30-90天窗口期内必须选择行使期权或者放弃期权,30天和60天都比较常见。未在规定行权窗口期间内行权,期权由公司收回。此外,期权通常都有一个最长10年的行权期限,主要是基于美国税法对激励型期权(见下文第4部分)的限制条件。

现实的情况是,让一个离职的员工(譬如二十几岁的工程师)在离职时或离职后的一两个月内找到行使期权所需要的资金,其实并不容易,尤其是还要考虑行使期权的税负。一方面,收益是纸面财富,这些期权(和行使后拿到的股权)没有市场没有流动性(创业公司的期权计划通常也限制交易),未来能否套现没人知道;但另一方面,公司和税务局却都要现金形式的行权价格和税款。所以,很多创业公司的员工在“另谋高就”时都不得不扔掉了期权这个“鸡肋”。

为了更好吸引人才,硅谷的一些创业公司已经开始采取补救措施。据外媒报道,2015年3月,独角兽Pinterest调整了期权计划,开始允许在公司工作两年以上的员工在离开公司后继续持有已经到位的股票期权,将行权时间窗口拉长了7年时间,这样到时候大部分人都有能力行权了,而且公司也可能已经上市了,行权就能立即套现,支付税费也不再是问题。

简法帮提示:

如果离职员工手中持有公司的期权,员工需要在期权文件规定的行权窗口期内决定是否行使期权,中国法院在判例中也认可了这种行权窗口期的有效性。公司方除了行权价格、手续,还需要考虑期权有关的员工税负和代扣代缴义务,因为在美国法律环境下的期权激励在引入中国后,还有一些水土不服的问题。

从中国境内的法律实践情况来看,创业公司引入更长的时间窗口则面临更多不确定性,不仅税务处理上不够明确(或者说不够优惠,见下文第4部分),而且期权会在公司治理和上市等各个方面带来困扰,所以,创业公司实践中的做法往往是在离职时一揽子解决(收回)期权和其他离职补偿问题(见下文第5部分),因此简法帮在线生成的期权文件中就针对境内架构的公司放弃了这种窗口期的约定,鼓励公司和员工在离职时达成包括期权在内的一揽子整体解决方案。

4、期权的税负

我们引入的期权激励借鉴自美国,美国的股票期权通常包括两种类型:(1)激励型期权(Incentive Stock Option, ISO)。这种期权面向员工,在满足持股期限(期权授予后满两年且行权后满一年)等限制性条件时,员工可以延迟纳税,行权时不缴纳个税(高收入员工存在一个替代性最低税问题,这里不深入讨论),转让股权时的收益按更优惠的资本利得纳税,而不是普通收入纳税,公司也不得扣除期权管理费用;(2)非法定期权(Nonqualified Stock Option, NSO)。这种期权在行权时需要按照差额个人收益(股权取得价与当时的市场价之间的差额)缴纳个人所得税,尽管这时候股票可能还没出售套现,而且作为普通收入计税,但没有法定的持股期限等限制条件,公司则可以扣除期权管理费用。前文提及的硅谷公司调整期权计划,基于上述分类就需要将激励型期权(ISO)转化为非法定期权(NSO),离职员工和公司两个方面分别面临者税负和管理费用扣除的问题。

而在中国现在的法律框架下,包括期权在内的员工股权激励税务制度跟期权的来源地国家——美国差异很大。周鸿祎等创业者曾高调呼吁国家对创新创业要放弃“惯性思维”,尤其是“期权按照个税征税不合理”的呼吁引起了无数创业公司和创业公司员工的共鸣,因为“国家是把期权收入和员工月工资收入加在一起,征收可能高达45%的个人所得税……(忽略了创业企业员工)或许在前五年甚至十年内一直拿着低工资。”

国家也在不断试验和推广改革措施,例如引入分期缴纳的规定:自2016年1月1日起,全国范围内的高新技术企业转化科技成果,给予本企业相关技术人员的股权奖励,个人一次缴纳税款有困难的,可根据实际情况自行制定分期缴税计划,在不超过5个公历年度内(含)分期缴纳,并将有关资料报主管税务机关备案。这里股权奖励是指企业无偿授予相关技术人员一定份额的股权或一定数量的股份。

该规定的局限性在于适用范围过窄,因为该文仅仅适用于高新技术企业转化科技成果给予本企业相关技术人员的股权奖励。且不论高新技术企业的认定要求,仅将该优惠限定在转化科技成果,给予本企业相关技术人员的股权奖励,就已把非技术人员排除在外了。况且规定里的股权奖励是指无偿授予的股权,那么期权算吗?看起来不算。实际上,对于无偿授予股权,这是员工激励里非常忌讳的做法,也面临着无偿授予股权对应的注册资本如何实缴的中国特色法律问题!

简法帮提示:

根据中国现有的税法规定,员工个人获得股权奖励时,按照“工资薪金所得”项目计算确定应纳税额,虽然有可能享受年底奖金类似的处理方式,仍然可能导致员工按累进税率适用最高达45%的个人所得税。但是,按照现有的个人所得税法,如果持有期权的个人不是公司员工,反倒可能根据所得税法适用于更低的20%的个税税率,公司员工作为期权的主要激励对象反而受到更高税率的“惩罚”,这岂不荒唐?!

简法帮基于现有法律框架,之前在36Kr发表过系列文章,在《关于创业公司股权激励的那些“税事儿”(之一)》中谈了创业公司应该了解的基本税收制度,在《关于创业公司股权激励的那些“税事儿”(之二) ——税收规划的秘诀》中进一步聊过有关股权激励制度设计中的税收规划问题,有兴趣的读者可以前往查看。

5、一揽子解决方案

无论是中国还是美国,实施期权而不是限制性股权来激励员工的一个重要作用就是延迟纳税。因为员工取得期权时是否产生所得仍未确定(员工不行权就不产生收入),所以一般在授予期权时不产生纳税义务。比较起来,限制性股权直接授予员工时就可能立即面临纳税义务。在实践中,大部分创业公司通过创始股东低价转让或者公司低价增发的方式,让员工像投资人一样直接或间接取得公司股权,尽管理论上可能构成“工资薪金所得”,但很少听说有创业公司按照股权取得价与当时的市场价之间的差额代扣代缴“工资薪金”个人所得税,公司可以理解为法律不完善,税务局也可能理解为偷税漏税。

鉴于中国目前针对包括期权在内的员工股权激励税务制度尚处在早期阶段,员工行权就会面临繁重的税务负担和现金压力,所以在大部分情况下,在职员工都推迟行使期权,以此观察公司发展状况来决定待(市场)价而入再待(上)市而沽。

但离职员工的期权应该如何处理呢?放弃到位的期权,员工肯定觉得不公平;行权又面临高昂的税负和现金压力。市场实践中常见的做法是在员工离职时通过一揽子协议解决,将员工资、奖金、不竞争补偿金、经济补偿金以及期权等综合考虑,谈判形成一揽子的解决方案,专业的律师还可以利用经济补偿金的税收优惠待遇为公司和个人促成双方都能够接受的合规方案。

简法帮提示

援引一个官司最终打到最高人民法院的案例来诠释前文内容,信息来源于2013年6月21日最高院《搜房控股有限公司与被申请人孙宝云合同纠纷再审民事裁定书》。

(1)30日行权窗口:“关于孙宝云的股票期权是否失效的问题。《股票期权协议》是双方当事人真实意思表示,内容不违反我国法律、行政法规的强制性规定,合法有效。搜房公司共授予孙宝云55000股的股票期权,孙宝云在期权有效期内享有依据协议选择购买搜房公司上述股票的权利。搜房北京公司与孙宝云于2009年7月1日解除劳动关系,依据《股票期权协议》第二部分总则第3条的约定,孙宝云的股票期权于2009年7月31日失效。但孙宝云早在2009年6月23日就以电子邮件的方式向莫天全提出了行使股票期权即购买股票的要求,并于7月9日和15日分别以电话及快递方式再次提出行使股票期权的要求。而莫天全在签署《股票期权协议》时表明其身份为搜房公司的董事会主席,在本案中亦以搜房公司代表人身份出现,故其有权代表搜房公司作出意思表示。对于孙宝云在股票期权有效期内提出的购买股票请求,依据《股票期权协议》,搜房公司应当向孙宝云出售股票。”

(2)一揽子解决方案——关于《离职协议书》是否终止《股票期权协议》的问题:“《离职协议书》虽然加盖了搜房北京公司的公章和搜房公司人力资源部的印章,但该协议书的内容为搜房北京公司就协商解除劳动合同事宜向孙宝云支付经济补偿金,并未提及孙宝云的股票期权问题,不足以推定搜房公司和孙宝云合意终止股票期权关系……《离职协议书》没有明确变更或终止《股票期权协议》,孙宝云和搜房公司之间的权利义务仍受《股票期权协议》的约束。”

在该案例中,员工孙宝云就注意到了30日行权窗口的问题。但在一揽子解决方案《离职协议书》中,双方没有明确地将股票期权问题涵盖在内,只是笼统地说“双方权利义务终止,除违反本协议的行为外,任何一方不得通过任何途径向对方主张任何权利”,可能是双方故意将期权问题切分出来单独处理,也有可能是双方的误解。但无论怎样,双方错过了员工离职达成一揽子解决方案这个最佳的时机。

123月/100

最全的jQuery插件列表

发布在 邵珠庆

jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不jquery及的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML documents、events、实现动画效果,并且方便地为网站提供 AJAX 交互。 jQuery 还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页保持代码和 html 内容分离,也就是说,不用再在 html 里面插入一堆js来调用命令了,只需定义 id 即可。今天在Kollermedia.at上发现了一篇JQuery插件列表的文章,特推荐如下。

文件上传(File upload)  JQuery_001

Ajax File Upload.
jQUploader.
Multiple File Upload plugin.
jQuery File Style.
Styling an input type file.
Progress Bar Plugin.

 

表单验证(Form Validation)

jQuery Validation.
Auto Help.
Simple jQuery form validation.
jQuery XAV - form validations.
jQuery AlphaNumeric.
Masked Input.
TypeWatch Plugin.
Text limiter for form fields.
Ajax Username Check with jQuery.

 
表单-选取框(Form - Select Box stuff)

jQuery Combobox.
jQuery controlled dependent (or Cascadign) Select List.
Multiple Selects.
Select box manipulation.
Select Combo Plugin.
jQuery - LinkedSelect
Auto-populate multiple select boxes.
Choose Plugin (Select Replacement).

 
表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.)

jQuery Form Plugin.
jQuery-Form.
jLook Nice Forms.
jNice.
Ping Plugin.
Toggle Form Text.
ToggleVal.
jQuery Field Plugin.
jQuery Form’n Field plugin.
jQuery Checkbox manipulation.
jTagging.
jQuery labelcheck.
Overlabel.
3 state radio buttons.
ShiftCheckbox jQuery Plugin.
Watermark Input.
jQuery Checkbox (checkboxes with imags).
jQuery SpinButton Control.
jQuery Ajax Form Builder.
jQuery Focus Fields.
jQuery Time Entry.

 
时间、日期和颜色选取(Time, Date and Color Picker)

jQuery UI Datepicker.
jQuery date picker plugin.
jQuery Time Picker.
Time Picker.
ClickPick.
TimePicker.
Farbtastic jQuery Color Picker Plugin.
Color Picker by intelliance.fr.

 
投票插件(Rating Plugins)

jQuery Star Rating Plugin.
jQuery Star Rater.
Content rater with asp.net, ajax and jQuery.
Half-Star Rating Plugin.

 
搜索插件(Search Plugins)

jQuery Suggest.
jQuery Autocomplete.
jQuery Autocomplete Mod.
jQuery Autocomplete by AjaxDaddy.
jQuery Autocomplete Plugin with HTML formatting.
jQuery Autocompleter.
AutoCompleter (Tutorial with PHP&MySQL).
quick Search jQuery Plugin.

 
编辑器(Inline Edit & Editors)JQuery_002

jTagEditor.
WYMeditor.
jQuery jFrame.
Jeditable - edit in place plugin for jQuery.
jQuery editable.
jQuery Disable Text Select Plugin.
Edit in Place with Ajax using jQuery.
jQuery Plugin - Another In-Place Editor.
TableEditor.
tEditable - in place table editing for jQuery.

 
多媒体、视频、Flash等(Audio, Video, Flash, SVG, etc)

jMedia - accessible multi-media embedding.
JBEdit - Ajax online Video Editor.
jQuery MP3 Plugin.
jQuery Media Plugin.
jQuery Flash Plugin.
Embed QuickTime.
SVG Integration.

 
图片(Photos/Images/Galleries)

ThickBox.
jQuery lightBox plugin.
jQuery Image Strip.
jQuery slideViewer.
jQuery jqGalScroll 2.0.
jQuery - jqGalViewII.
jQuery - jqGalViewIII.
jQuery Photo Slider.
jQuery Thumbs - easily create thumbnails.
jQuery jQIR Image Replacement.
jCarousel Lite.
jQPanView.
jCarousel.
Interface Imagebox.
Image Gallery using jQuery, Interface & Reflactions.
simple jQuery Gallery.
jQuery Gallery Module.
EO Gallery.
jQuery ScrollShow.
jQuery Cycle Plugin.
jQuery Flickr.
jQuery Lazy Load Images Plugin.
Zoomi - Zoomable Thumbnails.
jQuery Crop - crop any image on the fly.
Image Reflection.

 
Google地图(Google Map)

jQuery Plugin googlemaps.
jMaps jQuery Maps Framework.
jQmaps.
jQuery & Google Maps.
jQuery Maps Interface forr Google and Yahoo maps.
jQuery J Maps - by Tane Piper.

 
游戏(Games)

Tetris with jQuery.
jQuery Chess.
Mad Libs Word Game.
jQuery Puzzle.
jQuery Solar System (not a game but awesome jQuery Stuff).

 
表格等(Tables, Grids etc.)

UI/Tablesorter.JQuery_003
jQuery ingrid.
jQuery Grid Plugin.
Table Filter - awesome!.
TableEditor.
jQuery Tree Tables.
Expandable “Detail” Table Rows.
Sortable Table ColdFusion Costum Tag with jQuery UI.
jQuery Bubble.
TableSorter.
Scrollable HTML Table.
jQuery column Manager Plugin.
jQuery tableHover Plugin.
jQuery columnHover Plugin.
jQuery Grid.
TableSorter plugin for jQuery.
tEditable - in place table editing for jQuery.
jQuery charToTable Plugin.
jQuery Grid Column Sizing.
jQuery Grid Row Sizing.

 
统计图(Charts, Presentation etc.)

jQuery Wizard Plugin .
jQuery Chart Plugin.
Bar Chart.

 

边框、圆角、背景(Border, Corners, Background)

jQuery Corner.
jQuery Curvy Corner.
Nifty jQuery Corner.
Transparent Corners.
jQuery Corner Gallery.
Gradient Plugin.

 
文字和超链接(Text and Links)

jQuery Spoiler plugin.
Text Highlighting.
Disable Text Select Plugin.
jQuery Newsticker.
Auto line-height Plugin.
Textgrad - a text gradient plugin.
LinkLook - a link thumbnail preview.
pager jQuery Plugin.
shortKeys jQuery Plugin.
jQuery Biggerlink.
jQuery Ajax Link Checker.

 
鼠标提示(Tooltips)

jQuery Plugin - Tooltip.
jTip - The jQuery Tool Tip.
clueTip.
BetterTip.
Flash Tooltips using jQuery.
ToolTip.

 
菜单和导航(Menus, Navigations)

jQuery Tabs Plugin - awesome! . [demo nested tabs.]
another jQuery nested Tab Set example (based on jQuery Tabs Plugin).
jQuery idTabs.
jdMenu - Hierarchical Menu Plugin for jQuery.
jQuery SuckerFish Style.
jQuery Plugin Treeview.
treeView Basic.
FastFind Menu.
Sliding Menu.
Lava Lamp jQuery Menu.
jQuery iconDock.
jVariations Control Panel.
ContextMenu plugin.
clickMenu.
CSS Dock Menu.
jQuery Pop-up Menu Tutorial.
Sliding Menu.

http://stilbuero.de/jquery/tabs_3/
幻灯、翻转等(Accordions, Slide and Toggle stuff)

jQuery Plugin Accordion.
jQuery Accordion Plugin Horizontal Way.
haccordion - a simple horizontal accordion plugin for jQuery.
Horizontal Accordion by portalzine.de.
HoverAccordion.
Accordion Example from fmarcia.info.
jQuery Accordion Example.
jQuery Demo - Expandable Sidebar Menu.
Sliding Panels for jQuery.
jQuery ToggleElements.
Coda Slider.
jCarousel.
Accesible News Slider Plugin.
Showing and Hiding code Examples.
jQuery Easing Plugin.
jQuery Portlets.
AutoScroll.
Innerfade.

 
拖放插件(Drag and Drop)

UI/Draggables.
EasyDrag jQuery Plugin.
jQuery Portlets.
jqDnR - drag, drop resize.
Drag Demos.
XML XSL JSON Feeds

XSLT Plugin.
jQuery Ajax call and result XML parsing.
xmlObjectifier - Converts XML DOM to JSON.
jQuery XSL Transform.
jQuery Taconite - multiple Dom updates.
RSS/ATOM Feed Parser Plugin.
jQuery Google Feed Plugin.

 
浏览器(Browserstuff)

Wresize - IE Resize event Fix Plugin.
jQuery ifixpng.
jQuery pngFix.
Link Scrubber - removes the dotted line onfocus from links.
jQuery Perciformes - the entire suckerfish familly under one roof.
Background Iframe.
QinIE - for proper display of Q tags in IE.
jQuery Accessibility Plugin.
jQuery MouseWheel Plugin.

 
对话框、确认窗口(Alert, Prompt, Confirm Windows)

jQuery Impromptu.
jQuery Confirm Plugin.
jqModal.
SimpleModal.
CSS

jQuery Style Switcher.
JSS - Javascript StyleSheets.
jQuery Rule - creation/manipulation of CSS Rules.
jPrintArea.

 
DOM、AJAX和其它JQuery插件(DOM, Ajax and other jQuery plugins)

FlyDOM.
jQuery Dimenion Plugin.
jQuery Loggin.
Metadata - extract metadata from classes, attributes, elements.
Super-tiny Client-Side Include Javascript jQuery Plugin.
Undo Made Easy with Ajax.
JHeartbeat - periodically poll the server.
Lazy Load Plugin.
Live Query.
jQuery Timers.
jQuery Share it - display social bookmarking icons.
jQuery serverCookieJar.
jQuery autoSave.
jQuery Puffer.
jQuery iFrame Plugin.
Cookie Plugin for jQuery.
jQuery Spy - awesome plugin.
Effect Delay Trick.
jQuick - a quick tag creator for jQuery.
Metaobjects.
elementReady.

英文:http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/
作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

83月/100

jquery表单元素取值和选中

发布在 邵珠庆

获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;

获取值:

文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio:   $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();

控制表单元素:
文本框,文本区域:

$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容

多选框checkbox:

$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾

单选组radio:    $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select:

$("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

43月/100

PHP小偷程序原理、实例及改进

发布在 邵珠庆

优点:通过PHP小偷,我们可以借用别人网站上的信息而不用自己辛苦地去采集。
缺点:需要把整页的HTML代码读取到本地,然后通过匹配获取到想要的信息再进行显示,这样大大影响网页的加载速度。
改进:通过AJAX异步读取HTML代码,后台进行匹配获取到想要的信息,再显示到前台页面。
预备知识:PHP、AJAX、正则表达式。
关键字:file_get_contents()、fopen()、fwrite()、eregi(),前三个关键字都是关于PHP文件处理的函数,eregi()是关于正则表达式的函数。

一、PHP小偷原理的实现:

1、file_get_contents()、fopen()、fwrite()的应用

咱们用华夏黑客牛刀小试吧,把主页的全部信息获取过来。

建立一个PHP文件:
<?php
$url='http://www.77169.com';
//file_get_contents()函数获取网页的html文档
$file=file_get_contents($url);
//建立一个新文件ImitationIndex.htm
$newfile=fopen('ImitationIndex.htm','w');
//把内容读取进去
fwrite($newfile,$file);
//关闭打开的文件
fclose($newfile);
?>

ImitationIndex.htm获取主页全部的HTML(保存好,以备下次使用)。

2、eregi()函数的应用

通过eregi()获取里的内容:
<?php
$url='http://www.77169.com';
//file_get_contents()函数获取网页的html文档
$file=file_get_contents($url);
//通过eregi()匹配获取想要的信息
eregi('<title>(.*)</title>',$file,$rg);
//建立一个新文件
$newfile=fopen('title.htm','w');
//把内容读取进去
fwrite($newfile,$rg[1]);
?>

打开title.htm可以看到已经获取了<title></title>之间的内容

从上面的两个例子,已经知道PHP小偷的实现原理,从中也知道它的不足之处,但通过AJAX可以完善它,使它可以用于实践项目中。

二、PHP小偷技术的实用和改进:

目的:获取华夏黑客的最新资讯,并实时更新查看示例。

实际中可能只用到三个页面:showNews.php、Update.php、HackNews.htm,但为了能看到实时更新的效果,这里用到了模拟主页的页面ImitationIndex.htm。

showNews.php:
<style type="text/css">
body{background:#c60;}
a{color:#444;font:12px Courier New;padding:8px;}
a:hover{color:#f00}
#hei_content{width:400px;background:#ccc;border:2px solid #000;border-bottom:5px solid #000;}
</style>
<?php
echo('<div id="hei_content">');
include('HackNews.htm');
echo('</div>');
?>
<script type="text/javascript">
window.onload=UpdateNews;
function GetXmlHttp()
{
var xmlhttp;
try
{
//IE7.0 ect
xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch(a)
{
try
{
//ie6.0 ect
xmlhttp=new ActiveXObject("Mscrosoft.XMLHTTP");
}
catch(b)
{
//非IE
xmlhttp=new XMLHttpRequest();
}
}
return xmlhttp;
}
function StateChange()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
document.getElementById("hei_content").innerHTML=xmlhttp.responseText;
}
}
function UpdateNews()
{
xmlhttp=GetXmlHttp();
xmlhttp.onreadystatechange=StateChange;
var url='Update.php';
url=url+"?sid="+Math.random();
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
</script>

HackNews.htm是已经缓存的文件,这样不用加载主页上的整个HTML再显示,这个工作留给AJAX:
document.getElementById("hei_content").innerHTML=xmlhttp.responseText

xmlhttp.responseText就是加载更新后的内容。

Update.php:
<?php
$url='ImitationIndex.htm';
//file_get_contents()函数获取网页的html文档
$file=file_get_contents($url);
//$regx为正则表达式的内容,用于匹配获取想要的信息
$regx='<td background=http://hack.77169.com/UploadFiles_8057/200902/20090220100422648.gif colSpan=3 height=100>
(.*)</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colSpan=3><IMG height=8 src=/"http://hack.77169.com/UploadFiles_8057/200902/20090220100422568.gif';
//eregi()获取匹配到的内容,赋值给数组变量$rg;
eregi($regx,$file,$rg);
//建立一个新文件HackNews.htm
$newfile=fopen('HackNews.htm','w');
//把内容读取进去
fwrite($newfile,$rg[1]);
fclose($newfile);
//用iconv编码转换后,输出匹配的HTML内容
$rg[1]=iconv('gb2312','utf-8',$rg[1]);
echo($rg[1]);
?>
Update.php是异步更新的后台页面,“$newfile=fopen('HackNews.htm','w');”和“fwrite($newfile,$rg[1]);”把更新的内容重新保存在HackNews.htm中,下次在index.php中include时就直接调用这个页面,“$url='ImitationIndex.htm'”在实际应用中应该是“$url='http://www.77169.com'”,但为了便于调试,建立一个ImitationIndex.htm模拟页面,如果对ImitationIndex.htm页面中最新资讯中的内容改改,就可以看到实时更新效果。

总结:通过AJAX改进的PHP小偷技术,在采集多个网站的大量信息下,页面的加载速度并不会受多大影响。

43月/100

dedecms(织梦)采集规则规则宝典

发布在 邵珠庆

dedecms 采集系统确实很不错,可以免去一些站长手工添加信息的麻烦,设置一下采集规则、采集点,然后点采集,OK,几百篇文章就搞定了!呵呵,确实很省事的!下面介绍几种常用的采集规则的过滤方法:

应用示例一:标题中空格的过滤
经常在采集文章的时候,标题文字里面有空格,采回来后应用很是麻烦,所以需要在过滤处添加下面正则过滤

{dede:trim} {/dede:trim}

应用示例二:来源作者中连接的过滤
小龙 在采集文章的时候,有时会碰到作者混淆时,推荐采集时指定文章作者 ,有的系统里面作者或者来源处都有连接,直接采集的话将连接采集回来了,然后由于这两个字段有限制,通常会造成需要采集的内容没有采集回来,所以需要在过滤处添加下面正则过滤

{dede:trim}<a([^>]*)>([^<]*)</a>{/dede:trim}

应用示例三:文章内容中连接以及其他广告代码的过滤
这个就不用说了,当需要对所有东西过滤的时候,直接用上面所有的代码过滤就可以,但是实际应用中,我们只需要对连接、动画、调用等进行过滤。(这个需要按照对方内容里面具体含有什么代码来具体操作)
一般的只有链接,使用二中的代码进行过滤就可以了,但是实际上一般的网站现在都在内容里面加有广告等,所以采取下面的过滤正则就可以完成过滤:

{dede:trim}<a([^>]*)>([^<]*)</a>{/dede:trim}
{dede:trim}<IFRAME([^>]*)>([^>]*)</IFRAME>{/dede:trim}
{dede:trim}<object([^>]*)>([^>]*)</object>{/dede:trim}
{dede:trim}<script([^>]*)>([^>]*)</script>{/dede:trim}

应用示例四:过滤GG广告代码
其实这个就是在上面的内容过滤,但是很多论坛里的网友经常问这个,所以单独作为一个应用列出来:

{dede:trim}<script([^>]*)>([^>]*)</script>{/dede:trim}

下面是在综合论坛上网友的各种正则的一个全集:

{dede:trim}
{/dede:trim}
{dede:trim}<param([^>]*)>{/dede:trim}
{dede:trim}<embed([^>]*)>([^>]*)</embed>{/dede:trim}
{dede:trim}<embed([^>]*)>{/dede:trim}
{dede:trim}</embed>{/dede:trim}
{dede:trim}<object([^>]*)>([^>]*)</object>{/dede:trim}
{dede:trim}<object([^>]*)>{/dede:trim}
{dede:trim}</object>{/dede:trim}
{dede:trim}<OBJECT([^>]*)>([^>]*)</OBJECT>{/dede:trim}
{dede:trim}<OBJECT([^>]*)>{/dede:trim}
{dede:trim}</OBJECT>{/dede:trim}
{dede:trim}<iframe([^>]*)>([^>]*)</iframe>{/dede:trim}
{dede:trim}<iframe([^>]*)>{/dede:trim}
{dede:trim}</iframe>{/dede:trim}
{dede:trim}<IFRAME([^>]*)>([^>]*)</IFRAME>{/dede:trim}
{dede:trim}<IFRAME([^>]*)>{/dede:trim}
{dede:trim}</IFRAME>{/dede:trim}
{dede:trim}<font([^>]*)>([^<]*)</font>{/dede:trim}
{dede:trim}<font([^>]*)>{/dede:trim}
{dede:trim}</font>{/dede:trim}
{dede:trim}<a([^>]*)>([^<]*)</a>{/dede:trim}
{dede:trim}<a([^>]*)>{/dede:trim}
{dede:trim}</a>{/dede:trim}
{dede:trim}<td([^>]*)>([^>]*)</td>{/dede:trim}
{dede:trim}<td([^>]*)>{/dede:trim}
{dede:trim}</td>{/dede:trim}
{dede:trim}<tr([^>]*)>([^>]*)</tr>{/dede:trim}
{dede:trim}<tr([^>]*)>{/dede:trim}
{dede:trim}</tr>{/dede:trim}
{dede:trim}<tbody([^>]*)>([^>]*)</tbody>{/dede:trim}
{dede:trim}<tbody>{/dede:trim}
{dede:trim}</tbody>{/dede:trim}
{dede:trim}<table([^>]*)>([^>]*)</table>{/dede:trim}
{dede:trim}<table([^>]*)>{/dede:trim}
{dede:trim}</table>{/dede:trim}
{dede:trim}<img([^>]*)>{/dede:trim}
{dede:trim}<span([^>]*)>{/dede:trim}
{dede:trim}</span>{/dede:trim}
{dede:trim} {/dede:trim}
{dede:trim}<stong>{/dede:trim}
{dede:trim}</stong>{/dede:trim}

好了,上面四种应用基本上涵盖了采集的各种应用,掌握了这个,过滤基本上就不用求人了!

33月/100

js 验证表单提交验证类

发布在 邵珠庆

附加:js验证radio是否选择
<script language="JavaScript">
function checkform(obj)
{
for(i=0;i<obj.oo.length;i++)
if(obj.oo[i].checked==true) return true;
alert("请选择")
return false;
}
</script>
<form id="form1" name="form1" method="post" action="" onsubmit="return checkform(this)">
<input type="radio" name="oo" value="radiobutton" />
<input type="radio" name="oo" value="radiobutton" />
<input type="submit" name="Submit" value="提交 " />
</form>
1. 长度限制
<script>
function test()
{
if(document.a.b.value.length>50)
{
alert("不能超过50个字符!");
document.a.b.focus();
return false;
}
}
</script>
<form name=a onsubmit="return test()">
<textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
<input type="submit" name="Submit" value="check">
</form>

2. 只能是汉字
<input onkeyup="value="/oblog/value.replace(/[^/u4E00-/u9FA5]/g,'')">

3." 只能是英文
<script language=javascript>
function onlyEng()
{
if(!(event.keyCode>=65&&event.keyCode<=90))
event.returnvalue=false;
}
</script>

<input onkeydown="onlyEng();">

4. 只能是数字
<script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
//考虑小键盘上的数字键
event.returnvalue=false;
}
</script>

<input onkeydown="onlyNum();">

5. 只能是英文字符和数字
<input onkeyup="value="/oblog/value.replace(/[/W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))">

6. 验证 油箱格式
<SCRIPT LANGUAGE=javascript RUNAT=Server>
function isEmail(strEmail) {
if (strEmail.search(/^/w+((-/w+)|(/./w+))*/@[A-Za-z0-9]+((/.|-)[A-Za-z0-9]+)*/.[A-Za-z0-9]+$/) != -1)
return true;
else
alert("oh");
}
</SCRIPT>
<input type=text onblur=isEmail(this.value)>

7. 屏蔽关键字(这里屏蔽***和****)
<script language="javascript1.2">
function test() {
if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
alert(" ");
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit="return test()">
<input type=text name=b>
<input type="submit" name="Submit" value="check">
</form>

8. 两次输入密码是否相同
<FORM METHOD=POST ACTION="">
<input type="password" id="input1">
<input type="password" id="input2">
<input type="button" value="test" onclick="check()">
</FORM>
<script>
function check()
{
with(document.all){
if(input1.value!=input2.value)
{
alert("false")
input1.value = "";
input2.value = "";
}
else document.forms[0].submit();
}
}
</script>
够了吧
屏蔽右键 很酷
oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
加在body中

2.1 表单项不能为空

<script language="javascript">
<!--
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert("请输入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>

2.2 比较两个表单项的值是否相同

<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert("您两次输入的密码不一样!请重新输入.");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>

2.3 表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等

<script language="javascript">
<!--
function isNumber(String)
{
var Letters = "1234567890-"; //可以自己增加可输入值
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert("您的电话号码不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>
2.4 表单项输入数值/长度限定

<script language="javascript">
<!--
function CheckForm()
{
if (document.form.count.value > 100 || document.form.count.value < 1)
{
alert("输入数值不能小于零大于100!");
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)
{
alert("输入文字小于10!");
document.form.MESSAGE.focus();
return false;
}
return true;
}
//-->
</script>

2.5 中文/英文/数字/邮件地址合法性判断

<SCRIPT LANGUAGE="javascript">
<!--

function isEnglish(name) //英文值检测
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}

function isChinese(name) //中文值检测
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}

function isMail(name) // E-mail值检测
{
if(! isEnglish(name))
return false;
i = name.indexOf(" at ");
j = name dot lastIndexOf(" at ");
if(i == -1)
return false;
if(i != j)
return false;
if(i == name dot length)
return false;
return true;
}

function isNumber(name) //数值检测
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charAt(i) < "0" || name.charAt(i) > "9")
return false;
}
return true;
}

function CheckForm()
{
if(! isMail(form.Email.value)) {
alert("您的电子邮件不合法!");
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) {
alert("英文名不合法!");
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) {
alert("中文名不合法!");
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) {
alert("邮政编码不合法!");
form.PublicZipCode.focus();
return false;
}
return true;
}
//-->
</SCRIPT>

2.6 限定表单项不能输入的字符

<script language="javascript">
<!--

function contain(str,charset)// 字符串包含测试函数
{
var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}

function CheckForm()
{
if ((contain(document.form.NAME.value, "%/(/)><")) || (contain(document.form.MESSAGE.value, "%/(/)><")))
{
alert("输入了非法字符");
document.form.NAME.focus();
return false;
}
return true;
}
//-->
</script>