??xml version="1.0" encoding="utf-8" standalone="yes"?> 来源于:(x)http://ronghuicoffee.spaces.msn.com/blog/cns!3DC6B634723CEECE!124.entry 怽Q咱当电(sh)子工E师也是十余q了Q不有出息Q环֛周,也没有看见几个有出息的!回顾工程师生涯,感慨万千Q愿意讲几句掏心H子的话Q也给׃师弟师妹们提个醒Q希望他们比׃强! [1]好好规划自己的\Q不要跟着感觉赎ͼҎ(gu)个h的理惛_{安排,l大部分人ƈ不指望成Z么院士或教授Q而是希望zd滋润一些,爽一些。那么,需要慎重安排自q轨迹。从哪个行业入手Q逐渐对该行业深入了解Q不要频J蟩槽,特别是不要ؓ(f)了一点工资而{U阵圎ͼ从长q看Q这炚wҎ(gu)不算什么,当你对一个行业有那么几年的体?x),以后钱根本不是问题。频J地动荡不是上策Q最后你对哪个行业都没有摔R,永远是新手! [2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!l自己很大压力,如果你的心思全部放在这上面Q那么注定你成为孔乙己一cȝ人物Q适可而止ZQ因为技术只不过是你今后前途的支柱之一Q而且q不是最大的支柱Q除非你只愿意到老还是个工程师! [3]不要d技术高手,只去做综合素质高手!在企业里P我们时常瞧不h人,说他“什么都不懂Q凭啥拿那么多钱Q凭啥升官!”这是普遍的典型的工E师的迂腐之a?051很牛吗?人家能上d然有他的本事Q而且是你没有的本事。你xQ老板搞经营那么多q_(d)N见识不如你这个新兵?人家或许善于理Q善于领?x)老板意图Q善于部门协调等{。因此务必培养自己多斚w的能力,包括理Q亲和力Q察a观色能力Q攻兌力等Q要成ؓ(f)l合素质的高手,则前途无量,否则只能w在角落看示波器Q技术以外的技能才是更重要的本事!Q从古到今,国***Q一律如此! [4]多交C会(x)三教?ji)流的朋友!不要只和工程师交往Q认为有共同语言Q其实更重要的是和其他类人物交往Q如果你希望有朝一日当老板或高层管理,那么你整日面对的是q些人。了解他们的l历Q思维?fn)惯Q爱好,学习(fn)他们处理问题的模式,了解C会(x)各个角落的现象和问题Q这是以后发展的巨大的本钱,没有q些以后׃(x)W手W脚Q跌跌撞撞,遇到重重困难Q交不少学费Q成功的概率大大降低Q? [5]知识涉猎不一定专Q但一定要q!多看看其他方面的书,金融Q胦?x),q出口,E务Q法律等{,Z后做一些积累,以后的用处会(x)更大Q会(x)交许多学费Q! [6]抓住时机向技术管理或市场销售方面的转变Q要x前途就不能一直搞开发,适当时候要转变为管理或销售,前途会(x)更大Q以前搞技术也没有白搞Q以后还用得着。搞理可以培养自己的领D力,搞销售可以培养自q市场概念和思维Q同时ؓ(f)自己以后发展U篏庞大的h脉!应该说这才是前途的真正支柱Q!Q [7]逐渐克服自己的心里弱点和性格~陷Q多疑,敏感Q天真(贬义Qƈ不可爱)Q犹豫不冻I胆怯,多虑Q脸皮太薄,心不够黑Q教条式思维。。。这些工E师普遍存在的性格q必须改变Q很隑Q只在床上想一惛_然不可能Q去帮朋友守一个月地摊Q包准有效果Q去实践Q而不要只惻I不克服这些缺点,一切不可能Q甚臌目l理都当不好--管你可能技术不错! [8]工作的同时要Z后做准备Q徏立自q工作环境Q及(qing)早ؓ(f)自己配置一个工作环境,装备?sh)脑Q示波器Q可以买个二手的Q,仿真器,~程器等Q业余可以接Ҏ(gu)Q一斚w接触市场Q培d场感觉,同时也积累资金,更重要的是准备自q产品Q咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品Q拿L(fng)产品Q就可技术{让或与h合作搞企业!先把东西准备好,{待Z(x)Q否则,有了Z(x)也抓不住Q [9]要学?x)善于推销自己Q不仅要能干Q还要能_(d)能写Q善于利用一切机?x)推销自己Q树(wi)立自q品牌形象Q很必要Q要创造条件让别h了解自己Q不然老板怎么知道你能qԌ外面的投资h怎么怿你?提早把自己推销出去Q机?x)自然?x)来找你!搞个个h主页是个好注意!Q特别是培养自己在行业的名气Q有了名气,高薪Z(x)自不在话下,更重要的是有合作的机?.. [10]该出手时便出手!永远不可能有100%把握Q!Q条件差不多p大胆dQ去闯出自己的事业,不要犹UQ不要彷徨,q了不一定成功,但至ؓ(f)下一ơ冲ȝ累了l验Q不q永q没出息Q而且要干成必然要l历p|。不l历风雨Q怎么见彩虹,没有随随便便成功Q?/p>
来源Q?a >http://ronghuicoffee.spaces.msn.com/blog/cns!3DC6B634723CEECE!124.entry package com.nyhr.util; import java.util.GregorianCalendar; /** /** /** /** /** /** /** /** /** /** /** if (a.compareTo(b) < 0) while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR)) earlier.add(Calendar.DAY_OF_YEAR, tempDifference); if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR)) earlier.add(Calendar.DAY_OF_YEAR, tempDifference); return difference; /** <object id="video" width="400" height="200" border="0" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> <object classid="clsid:05589FA1-C356-11CE-BF01-00AA0055595A" id="ActiveMovie1" width="239" height="250"> <OBJECT ID=video1 CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" HEIGHT=288 WIDTH=352> <param name="_ExtentX" value="9313"> <object id="NSPlay" width=200 height=180 classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" standby="Loading Microsoft Windows Media Player components..." type="application/x-oleobject" align="right" hspace="5"> <embed src="http://www.jianzhan8.cn/sample.wmv" autostart="true" loop="true" width="200" height="150" > <OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA height=288 id=video1 width=305 VIEWASTEXT> <object ID=video2 WIDTH=300 HEIGHT=62 CLASSID=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA> <embed src=mms://www.jianzhan8.cn/sample.wmv width=200 height=200 autostart=true loop=true></embed> <object id=nstv classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 width=280 height=265 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject> <object id=nstv classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 width=280 height=60 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject> <object id="player" name="player" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="400" height="272"> 2.建立目:tomcat/webapps/TestFCKeditor. 3.FCKeditor2.2解压~?整个目录FCKeditor复制到项目的根目录下Q?br />目录l构为:(x)tomcat/webapps/TestFCKeditor/FCKeditor 4.FCKeditor-2.3.zip压羃包中\web\WEB-INF\目录下的web.xml文g合ƈ到项目的\WEB-INF\目录下的web.xml文g中?/p> 5. 修改合ƈ后的web.xml文gQ将名ؓ(f)SimpleUploader的Servlet的enabled参数值改为trueQ?br />以允怸传功能,Connector Servlet的baseDir参数值用于设|上传文件存攄位置?br />d标签定义: 6. 上面文g中两个servlet的映分别ؓ(f)Q?editor/filemanager/browser/default/connectors/jsp/connector 7.q入skin文g夹,如果你想使用fckeditor默认的这U奶黄色Q?br />那就把除了default文g夹外的另两个文g夹直接删? 8.删除/FCKeditor/目录下除fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文g以外的所有文? 9.打开/FCKeditor/fckconfig.js 10.其它 FCKConfig.TabSpaces = 0 ; 改ؓ(f)FCKConfig.TabSpaces = 1 ; 卛_~辑器域内可以用Tab键?/p> 如果你的~辑器还用在|站前台的话Q比如说用于留言本或是日记回复时Q那׃得不考虑安全了, 扑ֈQ?FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ; <form action="show.jsp" method="post" target="_blank"> <servlet-mapping>
]]>
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Calendar;
* <p>Title: 日期旉处理</p>
* <p>Description: 工具c?lt;/p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>
* @version 1.0
* @author
*/
public class DateUtil
{
/**
* ~省的DateFormat对象Q可以将一个java.util.Date格式化成yyyy-mm-dd输出
*/
private static DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
* U有构造函?br /> */
private DateUtil()
{
}
* <p>q回一个当前的旉Qƈ按格式{换ؓ(f)字符?lt;/p>
* 例:(x)17:27:03
* @return String
*/
public static String getNowTime()
{
GregorianCalendar gcNow = new GregorianCalendar();
java.util.Date dNow = gcNow.getTime();
DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
return df.format(dNow);
}
* <p>q回一个当前日期,q按格式转换为字W串</p>
* 例:(x)2004-4-30
* @return String
*/
public static String getNowDate()
{
GregorianCalendar gcNow = new GregorianCalendar();
java.util.Date dNow = gcNow.getTime();
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
return df.format(dNow);
}
* <p>q回一个当前日期和旉Qƈ按格式{换ؓ(f)字符?lt;/p>
* 例:(x)2004-4-30 17:27:03
* @return String
*/
public static String getNowDateTime()
{
GregorianCalendar gcNow = new GregorianCalendar();
java.util.Date dNow = gcNow.getTime();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
return df.format(dNow);
}
* <p>q回当前q?lt;/p>
* @return int
*/
public static int getThisYear()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.YEAR);
}
* q回本月
* @return int
*/
public static int getThisMonth()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.MONTH) + 1;
}
* q回今天是本月的W几?br /> * @return int ?开?br /> */
public static int getToDayOfMonth()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.DAY_OF_MONTH);
}
/**
* q回当前的小?br /> * @return int
*/
public static int getHour()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.HOUR);
}
/**
* q回当前的分?br /> * @return int q回当前的分?br /> */
public static int getMinute()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.MINUTE);
}
/**
* q回当前的秒?br /> * @return int W几U?br /> */
public static int getSecond()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.SECOND);
}
/**
* q回今天是本q的W几?
* @return int ?开?br /> */
public static int getToWeekOfYear()
{
GregorianCalendar gcNow = new GregorianCalendar();
return gcNow.get(GregorianCalendar.WEEK_OF_YEAR);
}
/**
* q回一格式化的日期
* @param time long
* @return String yyyy-mm-dd 格式
*/
public static String formatDate(java.util.Date date)
{
if (date == null) return "";
else return df.format(date);
}
* q回一格式化的日期
* @param time long
* @return String 2005-6-17 格式
*/
public static String formatSDate(java.util.Date date)
{
if (date == null) return "";
else
{
SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-M-d HH:mm:ss");
return bartDateFormat.format(date);
}
}
* q回已添加指定时间间隔的日期
* @param interval 表示要添加的旉间隔("y":q?"d":?"m":?如有必要可以自行增加)
* @param number 表示要添加的旉间隔的个?br /> * @param date java.util.Date()
* @return String 2005-5-12格式的日期字?br /> */
public static String dateAdd(String interval, int number,
java.util.Date date)
{
String strTmp = "";
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(date);
//加若q年
if (interval.equals("y"))
{
int currYear = gc.get(Calendar.YEAR);
gc.set(Calendar.YEAR, currYear + number);
}
//加若q月
else if (interval.equals("m"))
{
int currMonth = gc.get(Calendar.MONTH);
gc.set(Calendar.MONTH, currMonth + number);
}
//加若q天
else if (interval.equals("d"))
{
int currDay = gc.get(Calendar.DATE);
gc.set(Calendar.DATE, currDay + number);
}
//加若时
else if (interval.equals("h"))
{
int currDay = gc.get(Calendar.HOUR);
gc.set(Calendar.HOUR, currDay + number);
}
SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-M-d HH:mm:ss");
strTmp = bartDateFormat.format(gc.getTime());
return strTmp;
}
* <p>q回两个日期之间的单位间隔数</p>
* @param a java.util.Date
* @param b java.util.Date
* @return int 间隔?br /> */
public static int dateDiff(java.util.Date a, java.util.Date b)
{
int tempDifference = 0;
int difference = 0;
Calendar earlier = Calendar.getInstance();
Calendar later = Calendar.getInstance();
{
earlier.setTime(a);
later.setTime(b);
}
else
{
earlier.setTime(b);
later.setTime(a);
}
{
tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
difference += tempDifference;
}
{
tempDifference = later.get(Calendar.DAY_OF_YEAR)
- earlier.get(Calendar.DAY_OF_YEAR);
difference += tempDifference;
}
}
* <p>该方法是获得到每?h期一的数?lt;/p>
* @return -q回一个数?br /> */
/**
* <p>该方法是获得到每?h期一的数?lt;/p>
* @return -q回一个数?br /> */
public static int getDate(int curYear,int curMonth ,int curDate)
{
int day1 = 0;
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(curYear,curMonth-1,curDate);
int dayOfWeek = cal.get(cal.DAY_OF_WEEK);
System.out.println("curDate="+curDate +" dayOfWeek "+dayOfWeek);
switch(dayOfWeek)
{
case 1: //星期?br /> day1=0;
break;
case 2: //星期一
day1=1;
break;
case 3: //星期?br /> day1=2;
break;
case 4: //星期?br /> day1=3;
break;
case 5: //星期?br /> day1=4;
break;
case 6: //星期?br /> day1=5;
break;
case 7: //星期?br /> day1=6;
break;
}
return day1;
}
public static String checkTime(int id)
{
String bol = "";
Calendar tt = Calendar.getInstance();
String currDate=getNowDate();
System.out.println("currDate="+currDate);
int result = tt.get(Calendar.DAY_OF_WEEK);
int shour = tt.get(Calendar.HOUR_OF_DAY);
if (id == 3)
{
switch (result)
{
case 1:
break;
case 7:
if ((shour >= 8) && (shour < 12))
{
bol = "disabled";
break;
}
default:
if ((shour >= 8) && (shour < 12))
{
bol = "disabled";
break;
}
else if ((shour >= 14) && (shour < 17))
{
bol = "disabled";
break;
}
}
}
return bol;
}
/**
* <p>该方法是字W型转变成日期型</p>
* @param strX -传入字符cd
* @return -q回日期cd
*/
public static Date getStrDate(String strX)
{
Date date1=new Date();
if (!strX.equals(""))
{
try
{
date1=(DateFormat.getDateInstance()).parse(strX);
}
catch(Exception ex)
{
Debug.log("hhh","getStrDate()",ex.toString());
//System.out.println(ex.toString());
}
}
else
{
GregorianCalendar gcNow = new GregorianCalendar();
date1 = gcNow.getTime();
}
return date1;
}
/**
* <p>比较两日期字W串的大?lt;/p>
* @param d1
* @param d2
* @return (d1>d2)?2:(d1=d2)?1:0
*/
public static int compareDate(String d1, String d2)
{
short vl = 1;
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(getStrDate(d1));
int year = gc.get(GregorianCalendar.YEAR);
int month = gc.get(GregorianCalendar.MONTH);
int day = gc.get(GregorianCalendar.DAY_OF_MONTH);
gc.setTime(getStrDate(d2));
int tempYear = gc.get(GregorianCalendar.YEAR);
int tempMonth = gc.get(GregorianCalendar.MONTH);
int tempDay = gc.get(GregorianCalendar.DAY_OF_MONTH);
if(year != tempYear)
{
if (year>tempYear)
vl = 2;
else
vl = 0;
}
else
{
if (month != tempMonth)
{
if(month>tempMonth)
vl = 2;
else
vl = 0;
}
else
{
if (day != tempDay)
{
if (day > tempDay)
vl = 2;
else
vl = 0;
}
}
}
return vl;
}
}
]]>
<param name="ShowDisplay" value="0">
<param name="ShowControls" value="1">
<param name="AutoStart" value="1">
<param name="AutoRewind" value="0">
<param name="PlayCount" value="0">
<param name="Appearance value="0 value=""">
<param name="BorderStyle value="0 value=""">
<param name="MovieWindowHeight" value="240">
<param name="MovieWindowWidth" value="320">
<param name="FileName" value="http://www.jianzhan8.cn/sample.avi">
<embed width="400" height="200" border="0" showdisplay="0" showcontrols="1" autostart="1" autorewind="0" playcount="0" moviewindowheight="240" moviewindowwidth="320" filename="http://www.jianzhan8.cn/sample.avi" src="sample.avi">
</embed>
</object>2.mpg格式
<param name="Appearance" value="0">
<param name="AutoStart" value="-1">
<param name="AllowChangeDisplayMode" value="-1">
<param name="AllowHideDisplay" value="0">
<param name="AllowHideControls" value="-1">
<param name="AutoRewind" value="-1">
<param name="Balance" value="0">
<param name="CurrentPosition" value="0">
<param name="DisplayBackColor" value="0">
<param name="DisplayForeColor" value="16777215">
<param name="DisplayMode" value="0">
<param name="Enabled" value="-1">
<param name="EnableContextMenu" value="-1">
<param name="EnablePositionControls" value="-1">
<param name="EnableSelectionControls" value="0">
<param name="EnableTracker" value="-1">
<param name="Filename" value="http://www.jianzhan8.cn/sample.mpg" valuetype="ref">
<param name="FullScreenMode" value="0">
<param name="MovieWindowSize" value="0">
<param name="PlayCount" value="1">
<param name="Rate" value="1">
<param name="SelectionStart" value="-1">
<param name="SelectionEnd" value="-1">
<param name="ShowControls" value="-1">
<param name="ShowDisplay" value="-1">
<param name="ShowPositionControls" value="0">
<param name="ShowTracker" value="-1">
<param name="Volume" value="-480">
</object>3.rm格式
<param name="_ExtentY" value="7620">
<param name="AUTOSTART" value="0">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="0">
<param name="SRC" value="rtsp://203.207.131.35/vod/dawan-a.rm";>
<param name="CONTROLS" value="ImageWindow">
<param name="CONSOLE" value="Clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000"><embed SRC type="audio/x-pn-realaudio-plugin" CONSOLE="Clip1" CONTROLS="ImageWindow" HEIGHT="288" WIDTH="352" AUTOSTART="false"> </OBJECT> 4.wmv格式
<!-- ASX File Name -->
<param name="AutoRewind" value=1>
<param name="FileName" value="xxxxxx.wmv">
<!-- Display Controls -->
<param name="ShowControls" value="1">
<!-- Display Position Controls -->
<param name="ShowPositionControls" value="0">
<!-- Display Audio Controls -->
<param name="ShowAudioControls" value="1">
<!-- Display Tracker Controls -->
<param name="ShowTracker" value="0">
<!-- Show Display -->
<param name="ShowDisplay" value="0">
<!-- Display Status Bar -->
<param name="ShowStatusBar" value="0">
<!-- Diplay Go To Bar -->
<param name="ShowGotoBar" value="0">
<!-- Display Controls -->
<param name="ShowCaptioning" value="0">
<!-- Player Autostart -->
<param name="AutoStart" value=1>
<!-- Animation at Start -->
<param name="Volume" value="-2500">
<param name="AnimationAtStart" value="0">
<!-- Transparent at Start -->
<param name="TransparentAtStart" value="0">
<!-- Do not allow a change in display size -->
<param name="AllowChangeDisplaySize" value="0">
<!-- Do not allow scanning -->
<param name="AllowScan" value="0">
<!-- Do not show contect menu on right mouse click -->
<param name="EnableContextMenu" value="0">
<!-- Do not allow playback toggling on mouse click -->
<param name="ClickToPlay" value="0">
</object>5:最单的播放代码
把这个网址http://www.jianzhan8.cn/sample.wmv换成你要看的?sh)媄p?6:有图像的rm格式
<param name=_ExtentX value=5503>
<param name=_ExtentY value=1588>
<param name=AUTOSTART value=-1>
<param name=SHUFFLE value=0>
<param name=PREFETCH value=0>
<param name=NOLABELS value=0>
<param name=SRC value=http://www.jianzhan8.cn/sample.ram>
<param name=CONTROLS value=Imagewindow,StatusBar,ControlPanel>
<param name=CONSOLE value=RAPLAYER>
<param name=LOOP value=0>
<param name=NUMLOOP value=0>
<param name=CENTER value=0>
<param name=MAINTAINASPECT value=0>
<param name=BACKGROUNDCOLOR value=#000000>
</OBJECT>7:无图像的rm格式Q?如相壎ͼ歌曲...)
<param name=_ExtentX value=9657>
<param name=_ExtentY value=847>
<param name=AUTOSTART value=-1>
<param name=SHUFFLE value=0>
<param name=PREFETCH value=0>
<param name=NOLABELS value=0>
<param name=SRC value=http://www.jianzhan8.cn/sample.rm>
<param name=CONTROLS value=StatusBar,controlpanel>
<param name=CONSOLE value=Clip1>
<param name=LOOP value=0>
<param name=NUMLOOP value=0>
<param name=CENTER value=0>
<param name=MAINTAINASPECT value=0>
<param name=BACKGROUNDCOLOR value=#000000>
</object>8:最单的media格式的播攑֙
9:有图像的media播放器,自动调用|上的插?/strong>
<param name=URL value=http://www.jianzhan8.cn/sample.wma>
<PARAM NAME=UIMode value=full><PARAM NAME=AutoStart value=true>
<PARAM NAME=Enabled value=true>
<PARAM NAME=enableContextMenu value=false>
<param name=WindowlessVideo value=true></object>10:无图像的media播放?/strong>
<param name=URL value=http://www.jianzhan8.cn/sample.wma>
<PARAM NAME=UIMode value=full><PARAM NAME=AutoStart value=true>
<PARAM NAME=Enabled value=true>
<PARAM NAME=enableContextMenu value=false>
</object>11:在线播放rm格式视频代码
<param name="_ExtentX" value="18415">
<param name="_ExtentY" value="9102">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://www.jianzhan8.cn/sample.rm">
<param name="CONTROLS" value="Imagewindow">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object><br>
<object ID="RP2" CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" WIDTH="400" HEIGHT="57">
<param name="_ExtentX" value="18415">
<param name="_ExtentY" value="1005">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://www.jianzhan8.cn/sample.rm">
<PARAM NAME="CONTROLS" VALUE="ControlPanel,StatusBar">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object>
转自Q?a >http://www.jianzhan8.cn/shipin/index.htm
]]>Q?@ page contentType="text/html;charset=gb2312"%>
目录的徏?查与删除
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>文g的徏立、检查与删除Q?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath("");
//out.println(path);
File f=new File(path,"File.txt");
//out.println(f);
//out.println(f.exists());
if(f.exists()){//查File.txt是否存在
f.delete();//删除File.txt文g
out.println(path + "\\File.txt 存在Q已删除?);
}else{
f.createNewFile();//在当前目录下建立一个名为File.txt的文?
out.println(path + "\\File.txt 不存在,已徏立?);//输出目前所在的目录路径
}
%> Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>目录的徏?查与删除Q?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath("");
path=path + "\\Sub";//要建立的目录\?
File d=new File(path);//建立代表Sub目录的File对象Qƈ得到它的一个引?
if(d.exists()){//查Sub目录是否存在
d.delete();
out.println("Sub目录存在Q已删除");
}else{
d.mkdir();//建立Sub目录
out.println("Sub目录不存在,已徏?);
}
%>
Q?body>
Q?html>
如何在JSP中处理虚拟目?/strong>Q?@ page contentType="text/html;charset=gb2312"%>
取出目录中文件的Ҏ(gu)
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>JSP中如何处理虚拟目录</title>
Q?head>
Qbody>
取得虚拟目录对应的磁盘\径<br>
Web站点ȝ录的位置为<font color=#ff0000>Q?=request.getRealPath("/")%>Q?font>Qbr>
JSP|页所在的目录位置Qfont color=#ff0000>Q?=request.getRealPath("./")%>Q?font>Qbr>
JSP|页所在目录上一层目录的位置Qfont color=#ff0000>Q?=request.getRealPath("../")%>Q?font>Qbr>
Q?body>
Q?html>
文g属性的取得
Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.util.Date,java.io.*"%>
Qhtml>
Qhead>
Qtitle>文g属性的取得Q?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath("/");
File f=new File(path,"ReadData.txt");
if(f.exists()){
%>
Q?=f.getName()%>的属性如下:(x)Qbr>Qbr>
文g长度为:(x)Q?=f.length()%>
Q?=f.isFile()?"是文?:"不是文g"%>Qbr>
Q?=f.isDirectory()?"是目?:"不是目录"%>Qbr>
Q?=f.canRead()?"可读?:"不可d"%>Qbr>
Q?=f.canWrite()?"可写?:"不可写入"%>Qbr>
Q?=f.isHidden()?"是隐藏文?:"不是隐藏文g"%>Qbr>
文g的最后修Ҏ(gu)期ؓ(f)Q<%=new Date(f.lastModified())%>Qbr>
Q?
}else{
f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文?
%>
Q?=f.getName()%>的属性如下:(x)Qbr>Qbr>
文g长度为:(x)Q?=f.length()%>
Q?=f.isFile()?"是文?:"不是文g"%>Qbr>
Q?=f.isDirectory()?"是目?:"不是目录"%>Qbr>
Q?=f.canRead()?"可读?:"不可d"%>Qbr>
Q?=f.canWrite()?"可写?:"不可写入"%>Qbr>
Q?=f.isHidden()?"是隐藏文?:"不是隐藏文g"%>Qbr>
文g的最后修Ҏ(gu)期ؓ(f)Q<%=new Date(f.lastModified())%>Qbr>
Q?
}
%>
Q?body>
Q?html> Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>取出目录中文件的Ҏ(gu)--列出目录中的文gQ?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath("/");
File d=new File(path);//建立当前目录中文件的File对象
File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组
out.println("Qfont color=#ff0000>" + path + "目录下的文gQ</font>Qbr>");
for(int i=0;iQlist.length;i++){
if(listQI>.isFile()){
out.println(listQI>.getName() + "Qbr>");
}
}
out.println("Qbr>Qfont color=#ff0000>" + path + "目录下的目录Q</font>Qbr>");
for(int i=0;iQlist.length;i++){
if(listQI>.isDirectory()){
out.println(listQI>.getName() + "Qbr>");
}
}
%>
Q?body>
Q?html>
判断是否为空白文?Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>判断是否为空白文Ӟ/title>
Q?head>
Qbody>
Q?
String path=request.getRealPath("/");
out.println(path);
FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader对象Qƈ实例化ؓ(f)fr
//对FileReadercȝ成的对象使用read()Ҏ(gu)Q可以从字符中d下一个字W?
if(fr.read()==-1)//判断是否已读到文件的l尾
{
out.print("AtEnd.txt文g中没有数据<br>");
}else{
out.println("AtEnd.txt文g中有数据");
}
fr.close();
%>
Q?body>
Q?html>
d所有的文g数据Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*,java.lang.*"%>
Qhtml>
Qhead>
Qtitle>d所有的文g数据Q?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "\\ReadData.txt");
//关键在于dq程中,要判断所d的字W是否已l到了文件的末尾Qƈ且这个字W是不是文g中的断行W,卛_断该字符值是否ؓ(f)13?
int c=fr.read();//从文件中d一个字W?
//判断是否已读到文件结?
while(c!=-1){
out.print((char)c);//输出d的数?
c=fr.read();//从文件中l箋d数据
if(c==13){//判断是否为断行字W?
out.print("Qbr>");//输出分行标签
fr.skip(1);//略过一个字W?
//c=fr.read();//d一个字W?
}
}
fr.close();
%>
Q?body>
Q?html>
一行一行读取数?/strong>Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>文gdQ?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath("");//取得当前目录的\?
FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader对象Qƈ实例化ؓ(f)fr
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓ(f)br
String Line=br.readLine();//从文件读取一行字W串
//判断d到的字符串是否不为空
while(Line!=null){
out.println(Line + "Qbr>");//输出从文件中d的数?
Line=br.readLine();//从文件中l箋d一行数?
}
br.close();//关闭BufferedReader对象
fr.close();//关闭文g
%>
Q?body>
Q?html>
略过文g中的字符不读?/strong>Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>略过字节不读取</title>
Q?head>
Qbody>
Q?
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "\\ReadData.txt");
fr.skip(2);//跌2个字?
int c=fr.read();//d一个字?
while(c!=-1){
out.print((char)c);
c=fr.read();
}
fr.close();
%>
Q?body>
Q?html>
数据写入文?/strong>Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>数据写入文Ӟ/title>
Q?head>
Qbody>
Q?
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter对象Qƈ实例化fw
//字W串写入文g
fw.write("大家好!");
fw.write("本书是《JSP~程技巧?);
fw.write("请多多指教!");
fw.write("email:stride@sina.com");
fw.close();
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓ(f)br
String Line=br.readLine();
//d一行数?
out.println(Line + "Qbr>");
br.close();//关闭BufferedReader对象
fr.close();
%>
Q?body>
Q?html>
写入文件的数据分行Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>写入文件的数据分行Q?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "\\WriteData.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("大家好!");
bw.write("本书是《JSP~程技巧》?);
bw.newLine();//断行
bw.write("请多多指教!");
bw.newLine();//断行
bw.write("email: stride@sina.com");
bw.flush();//数据更新至文g
fw.close();//关闭文g?
out.println("写入文g内容为:(x)Qbr>");
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);
String Line=br.readLine();//d一行数?
while(Line!=null){
out.println(Line + "Qbr>");
Line=br.readLine();
}
fr.close();
%>
Q?body>
Q?html>
如何数据追加写入到文g
Q?@ page contentType="text/html;charset=gb2312"%>
Q?@ page import="java.io.*"%>
Qhtml>
Qhead>
Qtitle>写入文件的数据分行Q?title>
Q?head>
Qbody>
Q?
String path=request.getRealPath(".");
RandomAccessFile rf=new RandomAccessFile(path + "\\WriteData.txt","rw");//定义一个类RandomAccessFile的对象,q实例化
rf.seek(rf.length());//指针移动到文g末尾
rf.writeBytes("\nAppend a line to the file!");
rf.close();//关闭文g?
out.println("写入文g内容为:(x)Qbr>");
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);//d文g的BufferedRead对象
String Line=br.readLine();
while(Line!=null){
out.println(Line + "Qbr>");
Line=br.readLine();
}
fr.close();//关闭文g
%>
Q?body>
Q?html>Q?I>Q?I>Q?I>Q?I>
摘自Q?a >http://www.cncsk.com
]]>
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
/*
* FileEncrypterT.java
*
* Created on 2006q??9? 上午11:14
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
/**
*
* @author dragon love
*/
public class FileEncrypterT extends javax.swing.JFrame {
public static final int WIDTH = 550;
public static final int HEIGHT = 200;
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 300, Short.MAX_VALUE)
);
pack();
}
// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
FileEncrypter fe = new FileEncrypter();
fe.show();
}
FileEncrypterT(){
this.setSize(WIDTH,HEIGHT);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
this.setLocation((screenSize.width - WIDTH)/2,
(screenSize.height - HEIGHT)/2);
this.setTitle("文g加密?TriDES)");
Container c = this.getContentPane();
c.setLayout( new FlowLayout());
final FilePanel fp = new FilePanel("文g选择");
c.add(fp);
final KeyPanel pp = new KeyPanel("密码");
c.add(pp);
JButton jbE = new JButton("加密");
c.add(jbE);
jbE.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
File file = new File(fp.getFileName());
if (file.exists())
encrypt(file.getAbsoluteFile(),pp.getKey());
else
JOptionPane.showMessageDialog(
null,"请选择文gQ?,"提示",JOptionPane.OK_OPTION);
}
});
JButton jbD = new JButton("解密");
c.add(jbD);
jbD.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
File file = new File(fp.getFileName());
if (file.exists())
decrypt(file.getAbsoluteFile(),pp.getKey());
else
JOptionPane.showMessageDialog(
null,"请选择文gQ?,"提示",JOptionPane.OK_OPTION);
}
});
}
/**
* 加密函数
* 输入Q?br /> * 要加密的文gQ密码(?-Fl成Q共48个字W,表示3?位的密码Q如Q?br /> * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746
* 其中Q?br /> * AD67EA2F3BE6E5AD DES密码一
* D368DFE03120B5DF DES密码?br /> * 92A8FD8FEC2F0746 DES密码?br /> * 输出Q?br /> * 对输入的文g加密后,保存到同一文g夹下增加?.tdes"扩展名的文g中?br /> */
private void encrypt(File fileIn,String sKey){
try{
if(sKey.length() == 48){
byte[] bytK1 = getKeyByStr(sKey.substring(0,16));
byte[] bytK2 = getKeyByStr(sKey.substring(16,32));
byte[] bytK3 = getKeyByStr(sKey.substring(32,48));
FileInputStream fis = new FileInputStream(fileIn);
byte[] bytIn = new byte[(int)fileIn.length()];
for(int i = 0;i<fileIn.length();i++){
bytIn[i] = (byte)fis.read();
}
//加密
byte[] bytOut = encryptByDES(encryptByDES(
encryptByDES(bytIn,bytK1),bytK2),bytK3);
String fileOut = fileIn.getPath() + ".tdes";
FileOutputStream fos = new FileOutputStream(fileOut);
for(int i = 0;i<bytOut.length;i++){
fos.write((int)bytOut[i]);
}
fos.close();
JOptionPane.showMessageDialog(
this,"加密成功Q?,"提示",JOptionPane.OK_OPTION);
}else
JOptionPane.showMessageDialog(
this,"密码长度必须{于48Q?,"错误信息",JOptionPane.ERROR_MESSAGE);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 解密函数
* 输入Q?br /> * 要解密的文gQ密码(?-Fl成Q共48个字W,表示3?位的密码Q如Q?br /> * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746
* 其中Q?br /> * AD67EA2F3BE6E5AD DES密码一
* D368DFE03120B5DF DES密码?br /> * 92A8FD8FEC2F0746 DES密码?br /> * 输出Q?br /> * 对输入的文g解密后,保存到用h定的文g中?br /> */
private void decrypt(File fileIn,String sKey){
try{
if(sKey.length() == 48){
String strPath = fileIn.getPath();
if(strPath.substring(strPath.length()-5).toLowerCase().equals(".tdes"))
strPath = strPath.substring(0,strPath.length()-5);
else{
JOptionPane.showMessageDialog(
this,"不是合法的加密文Ӟ","提示",JOptionPane.OK_OPTION);
return;
}
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setSelectedFile(new File(strPath));
//用户指定要保存的文g
int ret = chooser.showSaveDialog(this);
if(ret==JFileChooser.APPROVE_OPTION){
byte[] bytK1 = getKeyByStr(sKey.substring(0,16));
byte[] bytK2 = getKeyByStr(sKey.substring(16,32));
byte[] bytK3 = getKeyByStr(sKey.substring(32,48));
FileInputStream fis = new FileInputStream(fileIn);
byte[] bytIn = new byte[(int)fileIn.length()];
for(int i = 0;i<fileIn.length();i++){
bytIn[i] = (byte)fis.read();
}
//解密
byte[] bytOut = decryptByDES(decryptByDES(
decryptByDES(bytIn,bytK3),bytK2),bytK1);
File fileOut = chooser.getSelectedFile();
fileOut.createNewFile();
FileOutputStream fos = new FileOutputStream(fileOut);
for(int i = 0;i<bytOut.length;i++){
fos.write((int)bytOut[i]);
}
fos.close();
JOptionPane.showMessageDialog(
this,"解密成功Q?,"提示",JOptionPane.OK_OPTION);
}
}else
JOptionPane.showMessageDialog(
this,"密码长度必须{于48Q?,"错误信息",JOptionPane.ERROR_MESSAGE);
}catch(Exception e){
JOptionPane.showMessageDialog(
this,"解密p|Q请核对密码Q?,"提示",JOptionPane.OK_OPTION);
}
}
/**
* 用DESҎ(gu)加密输入的字?br /> * bytKey需?字节长,是加密的密码
*/
private byte[] encryptByDES(byte[] bytP,byte[] bytKey) throws Exception{
DESKeySpec desKS = new DESKeySpec(bytKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES");
cip.init(Cipher.ENCRYPT_MODE,sk);
return cip.doFinal(bytP);
}
/**
* 用DESҎ(gu)解密输入的字?br /> * bytKey需?字节长,是解密的密码
*/
private byte[] decryptByDES(byte[] bytE,byte[] bytKey) throws Exception{
DESKeySpec desKS = new DESKeySpec(bytKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES");
cip.init(Cipher.DECRYPT_MODE,sk);
return cip.doFinal(bytE);
}
/**
* 输入密码的字WŞ式,q回字节数组形式?br /> * 如输入字W串QAD67EA2F3BE6E5AD
* q回字节数组Q{173,103,234,47,59,230,229,173}
*/
private byte[] getKeyByStr(String str){
byte[] bRet = new byte[str.length()/2];
for(int i=0;i<str.length()/2;i++){
Integer itg =
new Integer(16*getChrInt(str.charAt(2*i)) + getChrInt(str.charAt(2*i+1)));
bRet[i] = itg.byteValue();
}
return bRet;
}
/**
* 计算一?6q制字符?0q制?br /> * 输入Q?-F
*/
private int getChrInt(char chr){
int iRet=0;
if(chr=="0".charAt(0)) iRet = 0;
if(chr=="1".charAt(0)) iRet = 1;
if(chr=="2".charAt(0)) iRet = 2;
if(chr=="3".charAt(0)) iRet = 3;
if(chr=="4".charAt(0)) iRet = 4;
if(chr=="5".charAt(0)) iRet = 5;
if(chr=="6".charAt(0)) iRet = 6;
if(chr=="7".charAt(0)) iRet = 7;
if(chr=="8".charAt(0)) iRet = 8;
if(chr=="9".charAt(0)) iRet = 9;
if(chr=="A".charAt(0)) iRet = 10;
if(chr=="B".charAt(0)) iRet = 11;
if(chr=="C".charAt(0)) iRet = 12;
if(chr=="D".charAt(0)) iRet = 13;
if(chr=="E".charAt(0)) iRet = 14;
if(chr=="F".charAt(0)) iRet = 15;
return iRet;
}
// Variables declaration - do not modify
// End of variables declaration
}
* 文g选择lg?br /> */
class FilePanel extends JPanel{
FilePanel(String str){
JLabel label = new JLabel(str);
JTextField fileText = new JTextField(35);
JButton chooseButton = new JButton("览...");
this.add(label);
this.add(fileText);
this.add(chooseButton);
clickAction ca = new clickAction(this);
chooseButton.addActionListener(ca);
}
public String getFileName(){
JTextField jtf = (JTextField)this.getComponent(1);
return jtf.getText();
}
private class clickAction implements ActionListener{
clickAction(Component c){
cmpt = c;
}
public void actionPerformed(ActionEvent event){
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
int ret = chooser.showOpenDialog(cmpt);
if(ret==JFileChooser.APPROVE_OPTION){
JPanel jp = (JPanel)cmpt;
JTextField jtf = (JTextField)jp.getComponent(1);
jtf.setText(chooser.getSelectedFile().getPath());
}
}
private Component cmpt;
}
}
* 密码生成lg?br /> */
class KeyPanel extends JPanel{
KeyPanel(String str){
JLabel label = new JLabel(str);
JTextField fileText = new JTextField(35);
JButton chooseButton = new JButton("随机产生");
this.add(label);
this.add(fileText);
this.add(chooseButton);
clickAction ca = new clickAction(this);
chooseButton.addActionListener(ca);
}
//q回生成的密码(48个字W长度)
public String getKey(){
JTextField jtf = (JTextField)this.getComponent(1);
return jtf.getText();
}
private class clickAction implements ActionListener{
clickAction(Component c){
cmpt = c;
}
public void actionPerformed(ActionEvent event){
try{
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(56);
Key ke = kg.generateKey();
byte[] bytK1 = ke.getEncoded();
ke = kg.generateKey();
byte[] bytK2 = ke.getEncoded();
ke = kg.generateKey();
byte[] bytK3 = ke.getEncoded();
JPanel jp = (JPanel)cmpt;
JTextField jtf = (JTextField)jp.getComponent(1);
jtf.setText(getByteStr(bytK1)+getByteStr(bytK2)+getByteStr(bytK3));
}catch(Exception e){
e.printStackTrace();
}
}
private String getByteStr(byte[] byt){
String strRet = "";
for(int i=0;i<byt.length;i++){
//System.out.println(byt[i]);
strRet += getHexValue((byt[i]&240)/16);
strRet += getHexValue(byt[i]&15);
}
return strRet;
}
private String getHexValue(int s){
String sRet=null;
switch (s){
case 0: sRet = "0";break;
case 1: sRet = "1";break;
case 2: sRet = "2";break;
case 3: sRet = "3";break;
case 4: sRet = "4";break;
case 5: sRet = "5";break;
case 6: sRet = "6";break;
case 7: sRet = "7";break;
case 8: sRet = "8";break;
case 9: sRet = "9";break;
case 10: sRet = "A";break;
case 11: sRet = "B";break;
case 12: sRet = "C";break;
case 13: sRet = "D";break;
case 14: sRet = "E";break;
case 15: sRet = "F";
}
return sRet;
}
private Component cmpt;
}
}
摘自Q?a target="_blank">http://dev.csdn.net/article/article/63/63304.shtm
]]>
]]>
]]>
FCKeditor 2.2 (FCKeditor基本文g)
然后FCKeditor-2.3.zipQjavaQ压~包中\web\WEB-INF\lib\目录下的两个jar文g拷到目的\WEB-INF\lib\目录下。把其中的src目录下的FCKeditor.tld文gcopy到TestFCKedit/FCKeitor/WEB-INF/?/p>
<taglib>
<taglib-uri>/TestFCKeditor</taglib-uri>
<taglib-location>/WEB-INF/FCKeditor.tld</taglib-location>
</taglib>
?editor/filemanager/upload/simpleuploaderQ需要在两个映射前面加上/FCKeditorQ?br />x?FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector?br />/FCKeditor/editor/filemanager/upload/simpleuploader?/p>
删除目录/editor/_source,
删除/editor/filemanager/browser/default/connectors/下的所有文?br />删除/editor/filemanager/upload/下的所有文?br />删除/editor/lang/下的除了fcklanguagemanager.js, en.js, zh.js, zh-cn.js四个文g的所有文?/p>
修改 FCKConfig.DefaultLanguage = 'zh-cn' ;
把FCKConfig.LinkBrowserURL{的值替换成以下内容Q?br />FCKConfig.LinkBrowserURL
= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" ;
FCKConfig.ImageBrowserURL
= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector" ;
FCKConfig.FlashBrowserURL
= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector" ;
FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=File' ;
FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Flash' ;
FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Image' ;
fckconfig.js总配|文Ӟ可用记录本打开Q修改后文件存为utf-8 ~码格式。找刎ͼ(x)
在前台千万不要用Default的toolbarQ要么自定义一下功能,要么qpȝ已经定义好的BasicQ?br />也就是基本的toolbarQ找刎ͼ(x)
FCKConfig.ToolbarSets["Basic"] = [
['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-',
'Smiley','SpecialChar','Replace','Preview'] ] ;
q是改过的BasicQ把囑փ功能LQ把d链接功能LQ因为图像和链接和flash和图像按钮添加功能都能让前台
늛接访问和上传文gQ?fckeditorq支持编辑域内的鼠标右键功能?br />
FCKConfig.ContextMenu = ['Generic',/*'Link',*/'Anchor',/*'Image',*/'Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField',
/*'ImageButton',*/'Button','BulletedList','NumberedList','TableCell','Table','Form'] ;
q也是改q的把鼠标右键的“链接、图像,FLASHQ图像按钮”功能都L?/p>
加上几种我们常用的字?
FCKConfig.FontNames
= '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;
7、添加页?br />
<%@ page language="java" import="com.fredck.FCKeditor.*" %>
<%@ taglib uri="/WEB-INF/tlds/FCKeditor.tld" prefix="FCK" %>
<script type="text/javascript" src="FCKeditor/fckeditor.js"></script>
<table border="0" width="700"><tr><td>
<textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px">input</textarea>
<script type="text/javascript">
var oFCKeditor = new FCKeditor('content') ;
oFCKeditor.BasePath = "FCKeditor/" ;
oFCKeditor.Height = 400;
oFCKeditor.ToolbarSet = "Default" ;
oFCKeditor.ReplaceTextarea();
</script>
<input type="submit" value="Submit">
</td></tr></table>
</form>
~辑web.xml 文集 d 如下片断
<servlet>
<servlet-name>SimpleUploader</servlet-name>
<servlet-class>com.fredck.FCKeditor.uploader.SimpleUploaderServlet</servlet-class>
<init-param>
<param-name>baseDir</param-name>
<param-value>/UserFiles/</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>enabled</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsFile</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsFile</param-name>
<param-value>php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi</param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsImage</param-name>
<param-value>jpg|gif|jpeg|png|bmp</param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsImage</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsFlash</param-name>
<param-value>swf|fla</param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsFlash</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-name>Connector</servlet-name>
<url-pattern>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SimpleUploader</servlet-name>
<url-pattern>/FCKeditor/editor/filemanager/upload/simpleuploader</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/WEB-INF/FCKeditor.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/FCKeditor.tld</taglib-location>
</taglib>
OKQ?/p>
<input onkeydown="if(event.keyCode==13)event.keyCode=9" > <br>
只能是中?lt;input onkeyup="value=value.replace(/[ -~]/g,'')" onkeydown="if(event.keyCode==13)event.keyCode=9"> <br>
屏蔽输入?lt;input style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9"> <br>
只能输入英文和数?lt;input onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" onkeydown="if(event.keyCode==13)event.keyCode=9"> <br>
只能是数?lt;input onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"><br>
只能昄Q不能修?lt;input readonly value="只能昄Q不能修?>
只能是数字,判断按键的倹{?br /><script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)||(event.keyCode==8)))
event.returnValue=false;
}
</script>
<input onkeydown="onlyNum();">
获取键盘的KeyCode
<html>
<head>
<script language="javascript">
ns4 = (document.layers) ? true : false;
ie4 = (document.all) ? true : false;
function keyDown(e){
if(ns4){
var nkey=e.which;
var iekey='现在是ns览?;
var realkey=String.fromCharCode(e.which);
}
if(ie4){
var iekey=event.keyCode;
var nkey='现在是ie览?;
var realkey=String.fromCharCode(event.keyCode);
if(event.keyCode==32){realkey='\' I格\''}
if(event.keyCode==13){realkey='\' 回R\''}
if(event.keyCode==27){realkey='\' Esc\''}
if(event.keyCode==16){realkey='\' Shift\''}
if(event.keyCode==17){realkey='\' Ctrl\''}
if(event.keyCode==18){realkey='\' Alt\''}
}
alert('ns览器中键?'+nkey+'\n'+'ie览器中键?'+iekey+'\n'+'实际键ؓ(f)'+realkey);
}
document.onkeydown = keyDown;
if(ns4){
document.captureEvents(Event.KEYDOWN);}
</script>
</head>
<body>
//Javascript Document.
<hr>
<center>
<h3>hL一个键。。。?lt;/h3>
</center>
</body>
</html>
限制|页用键?/p>
<body onkeydown="alert('用');return false;">
限制键盘的某个键Qbody onkeydown="if(event.keyCode==num){alert('用');return false;}
再加个找按键的?/p>
<script>
function show(){
alert("ASCII代码是:(x)"+event.keyCode);
}
</script>
<body onkeydown="show()">
只能是IP地址
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<style>
.a3{width:30;border:0;text-align:center}
</style>
<script>
function mask(obj){
obj.value=obj.value.replace(/[^\d]/g,'')
key1=event.keyCode
if (key1==37 || key1==39)
{ obj.blur();
nextip=parseInt(obj.name.substr(2,1))
nextip=key1==37?nextip-1:nextip+1;
nextip=nextip>=5?1:nextip
nextip=nextip<=0?4:nextip
eval("ip"+nextip+".focus()")
}
if(obj.value.length>=3)
if(parseInt(obj.value)>=256 || parseInt(obj.value)<=0)
{
alert(parseInt(obj.value)+"IP地址错误Q?)
obj.value=""
obj.focus()
return false;
}
else
{ obj.blur();
nextip=parseInt(obj.name.substr(2,1))+1
nextip=nextip>=5?1:nextip
nextip=nextip<=0?4:nextip
eval("ip"+nextip+".focus()")
}
}
function mask_c(obj)
{
clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))
}
</script>
<title>IP地址输入</title>
</head>
<body>IP地址输入
<div style="border-width:1;border-color:balck;border-style:solid;width:165;font-size:9pt">
<input type=text name=ip1 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()>.
<input type=text name=ip2 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()>.
<input type=text name=ip3 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()>.
<input type=text name=ip4 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()>
</div>
</body>
?default#savehistory防止后退清空text文本框:(x)
<HTML>
<HEAD>
<META NAME="save" CONTENT="history">
<STYLE>
.saveHistory {behavior:url(#default#savehistory);}
</STYLE>
</HEAD>
<BODY>
<INPUT class=saveHistory type=text id=oPersistInput>
<input type=button onclick='javascript:location.href=" value='点击q入,再按后退键试试?'>
</BODY>
</HTML>
TEXTAREA自适应文字行数的多?/p>
<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
上传预览囄
<img id=pic src=http://www.cnbruce.com/images/logo.gif>
<input type=file name=file><input type=button onclick=pic.src=file.value value=预览囄>
<input type=button onclick=alert(file.value) value=囄地址>
<input type=button onclick="file.outerHTML=file.outerHTML.replace(/value=\w/g,'')" value="清除file里字">
L下拉选项的边?br /><div style="position: absolute; left: 10px; top: 10px; width: 115px; height: 20px; clip:rect(2 114 20 2);">
<select>
<option >cnpeople</option>
<option >cnrose</option>
<option >cnbruce</option>
</select>
</font>
</div>
下拉列表打开H口
<select onChange="if(this.selectedIndex && this.selectedIndex!=0){window.open(this.value);}this.selectedIndex=0;">
<option selected>更多链接…?lt;/option>
<option value=">
<option value=">
<option value="
</select>
通过下拉菜单传递蟩?/p>
<form action="showlog.asp?" >
<select name="cat_id" onpropertychange="form.submit();">
<option value="">==请选择==</option>
<option value="11">11</option>
<option value="22">22</option>
</select>
</form>
TAB键在文本域中的体?/p>
<script>
function editTab()
{
var code, sel, tmp, r
var tabs=""
event.returnValue = false
sel =event.srcElement.document.selection.createRange()
r = event.srcElement.createTextRange()
switch (event.keyCode)
{
case (8) :
if (!(sel.getClientRects().length > 1))
{
event.returnValue = true
return
}
code = sel.text
tmp = sel.duplicate()
tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
sel.setEndPoint("startToStart", tmp)
sel.text = sel.text.replace(/^\t/gm, "")
code = code.replace(/^\t/gm, "").replace(/\r\n/g, "\r")
r.findText(code)
r.select()
break
case (9) :
if (sel.getClientRects().length > 1)
{
code = sel.text
tmp = sel.duplicate()
tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
sel.setEndPoint("startToStart", tmp)
sel.text = "\t"+sel.text.replace(/\r\n/g, "\r\t")
code = code.replace(/\r\n/g, "\r\t")
r.findText(code)
r.select()
}
else
{
sel.text = "\t"
sel.select()
}
break
case (13) :
tmp = sel.duplicate()
tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
tmp.setEndPoint("endToEnd", sel)
for (var i=0; tmp.text.match(/^[\t]+/g) && i<tmp.text.match(/^[\t]+/g)[0].length; i++) tabs += "\t"
sel.text = "\r\n"+tabs
sel.select()
break
default :
event.returnValue = true
break
}
}
</script>
<textarea cols=75 rows=20 onkeydown="editTab()">
<script>
alert("ok")
</script></textarea>
文本框的?下拉
form name="cnbruce">
<textarea name="com">
</textarea>
</form>
<SPAN title='攑֤输入? style='FONT-SIZE: 12px; CURSOR: hand' onclick=document.cnbruce.com.rows+=4>向下</SPAN>
<SPAN title='~小输入? style='FONT-SIZE: 12px; CURSOR: hand' class='arrow' onclick='if(document.cnbruce.com.rows>=4)document.cnbruce.com.rows-=4;else return false'>向上</SPAN>
一个复选框Q点M后一l复选框全部都选上
<input type="checkbox" name="checkA" onpropertychange="for(i=0;i<A.children.length;i++){A.children[i].checked=this.checked}">a
<br>
<span id="A">
<input type="checkbox" name="A1">
<input type="checkbox" name="A2">
<input type="checkbox" name="A3">
</span>
Debug TextareaQ在U写 js 脚本的时候,用来x查错的东西!
<HTML>
<HEAD>
<TITLE>Debug Textarea</TITLE>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
</HEAD>
<style>
* {
font-size: 12px
}
body {
margin: 10px; padding: 0px
}
table.list{
cursor: default;
border:1px solid #cccccc
background-color: #cccccc;
border-collapse: collapse;
border-Color: #cccccc;
}
</style>
<script language="javascript">
// Coded by windy_sk <windy_sk@126.com> 20040205
function reportError(msg,url,line) {
var str = "You have found an error as below: \n\n";
str += "Err: " + msg + " on line: " + line;
alert(str);
return true;
}
window.onerror = reportError;
document.onkeydown = function() {
if(event.ctrlKey){
switch(event.keyCode) {
case 82: //r
runcode();
break;
case 83: //s
savecode();
break;
case 71: //g
goto(prompt('Please input the line number', '1'));
break;
case 65: //a
document.execCommand("SelectAll");
break;
case 67: //c
document.execCommand("Copy");
break;
case 88: //x
document.execCommand("Cut");
break;
case 86: //v
document.execCommand("Paste");
break;
case 90: //z
document.execCommand("Undo");
break;
case 89: //y
document.execCommand("Redo");
break;
default:
break;
}
event.keyCode = 0;
event.returnValue = false;
}
return;
}
function show_ln(){
var txt_ln = document.getElementById('txt_ln');
var txt_main = document.getElementById('txt_main');
txt_ln.scrollTop = txt_main.scrollTop;
while(txt_ln.scrollTop != txt_main.scrollTop) {
txt_ln.value += (i++) + '\n';
txt_ln.scrollTop = txt_main.scrollTop;
}
return;
}
function editTab(){
var code, sel, tmp, r
var tabs=''
event.returnValue = false
sel =event.srcElement.document.selection.createRange()
r = event.srcElement.createTextRange()
switch (event.keyCode){
case (8) :
if (!(sel.getClientRects().length > 1)){
event.returnValue = true
return
}
code = sel.text
tmp = sel.duplicate()
tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
// 出错验代码~~~~~~
if(sel.parentElement() != tmp.parentElement()) return;
sel.setEndPoint('startToStart', tmp)
sel.text = sel.text.replace(/^\t/gm, '')
code = code.replace(/^\t/gm, '').replace(/\r\n/g, '\r')
r.findText(code)
r.select()
break
case (9) :
if (sel.getClientRects().length > 1){
code = sel.text
tmp = sel.duplicate()
tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
// 出错验代码~~~~~~
if(sel.parentElement() != tmp.parentElement()) return;
sel.setEndPoint('startToStart', tmp)
sel.text = '\t'+sel.text.replace(/\r\n/g, '\r\t')
code = code.replace(/\r\n/g, '\r\t')
r.findText(code)
r.select()
}else{
sel.text = '\t'
sel.select()
}
break
case (13) :
tmp = sel.duplicate()
tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
// 出错验代码~~~~~~
if(sel.parentElement() != tmp.parentElement()) return;
tmp.setEndPoint('endToEnd', sel)
for (var i=0; tmp.text.match(/^[\t]+/g) && i<tmp.text.match(/^[\t]+/g)[0].length; i++) tabs += '\t'
sel.text = '\r\n'+tabs
sel.select()
break
default :
event.returnValue = true
break;
}
return;
}
function runcode() {
var str = document.getElementById("txt_main").value;
var code_win = window.open('about:blank');
code_win.document.open();
code_win.document.writeln("<script>");
code_win.document.writeln("function reportError(msg,url,line){\nline-=14;\nvar str='You have found an error as below: \\n\\n';\nstr+='Err: '+msg+' on line: '+(line);\nalert(str);\nopener.goto(line);\nopener.focus();\nwindow.onerror=null;\nsetTimeout('self.close()',10);\nreturn true;\n}");
code_win.document.writeln("window.onerror = reportError;");
code_win.document.writeln("<\/script>");
code_win.document.writeln(str);
code_win.document.close();
return;
}
function savecode() {
var str = document.getElementById("txt_main").value;
var code_win = window.open('about:blank','_blank','top=10000');
code_win.document.open();
code_win.document.writeln(str);
code_win.document.close();
code_win.document.execCommand('saveas','','code.html');
code_win.close();
return;
}
function goto(ln) {
if(!/^\d+$/.test(ln)) return;
var obj = document.getElementById("txt_main");
var rng = obj.createTextRange();
var arr = obj.value.replace(/\r/, "").split(/\n/);
if(ln>arr.length) ln = arr.length;
var str_tmp = "";
for(var i=0; i<ln-1; i++) {
str_tmp += arr[i];
}
rng.moveStart('character',str_tmp.length+1);
str_tmp = "";
for(i=ln; i<arr.length; i++) {
str_tmp += arr[i];
}
rng.moveEnd('character',-str_tmp.length);
rng.select();
return;
}
window.onload = function() {document.getElementById("txt_main").value = "<script>\nalert(')\n<\/script>";}
</script>
<BODY>
<table width='600' class='list' border='1' bgcolor='#eeeeee' bordercolorlight='#000000' bordercolordark='#FFFFFF' cellpadding='0' cellspacing='0'>
<tr bgcolor='#cccccc'>
<td colspan='2' height='20' align='center'><b>Debug Textarea</b></td>
</tr>
<tr>
<td colspan='2'>
<table width='95%' border='0' align='center' >
<tr>
<td align='center'><br />
<textarea id='txt_ln' name='content' rows='10' style='width:40px;overflow:hidden;height:200px;border-right:0px;text-align:right;line-height:14px' onselectstart='this.nextSibling.focus();return false' readonly></textarea><textarea id='txt_main' name='content' rows='10' cols='80' onkeydown='editTab()' onkeyup='show_ln()' onscroll='show_ln()' wrap='off' style='overflow:auto;height:200px;padding-left:5px;border-left:0px;line-height:14px'></textarea>
<script>for(var i=1; i<=20; i++) document.getElementById('txt_ln').value += i + '\n';</script>
</td>
</tr>
<tr>
<td align='center'><br />
<input type='button' value=' q??' onclick='runcode()' accesskey='r'>
<input type='button' value=' ??' onclick='savecode()' accesskey='s'>
<input type='button' value=' ??' onclick="goto(prompt('Please input the line number', '1'))" accesskey='g'>
</td>
</tr>
</table>
</td>
</tr>
</table>
</BODY>
</HTML>
匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]
匚w双字节字W?包括汉字在内)Q[^\x00-\xff]
应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?/p>
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匚wI的正则表辑ּQ\n[\s| ]*\r
匚wHTML标记的正则表辑ּQ?<(.*)>.*<\/\1>|<(.*) \/>/
匚w首尾I格的正则表辑ּQ?^\s*)|(\s*$)
应用Qjavascript中没有像vbscript那样的trim函数Q我们就可以利用q个表达式来实现Q如下:(x)
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正则表达式分解和转换IP地址Q?/p>
下面是利用正则表辑ּ匚wIP地址QƈIP地址转换成对应数值的JavascriptE序Q?/p>
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匚wIP地址的正则表辑ּ
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不过上面的程序如果不用正则表辑ּQ而直接用split函数来分解可能更单,E序如下Q?/p>
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是Q?+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匚w|址URL的正则表辑ּQ?a href="http://([\w-]+\.)+[\w-]+(/[\w">http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式去除字串中重复的字W的法E序Q?/p>
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //l果为:(x)abcefgi
我原来在CSDN上发贴寻求一个表辑ּ来实现去除重复字W的Ҏ(gu)Q最l没有找刎ͼq是我能惛_的最单的实现Ҏ(gu)。思\是用后向引用取出包括重复的字符Q再以重复的字符建立W二个表辑ּQ取C重复的字W,两者串q。这个方法对于字W顺序有要求的字W串可能不适用?/p>
得用正则表达式从URL地址中提取文件名的javascriptE序Q如下结果ؓ(f)page1
s="s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正则表达式限制网表单里的文本框输入内容Q?/p>
用正则表辑ּ限制只能输入中文Qonkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正则表辑ּ限制只能输入全角字符Q?onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正则表辑ּ限制只能输入数字Qonkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正则表辑ּ限制只能输入数字和英文:(x)onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
一个正则表辑ּ是由普通字W(例如字符 a ?zQ以?qing)特D字W(UCؓ(f)元字W)l成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符丌Ӏ正则表辑ּ作ؓ(f)一个模板,某个字W模式与所搜烦的字W串q行匚w?
q里有一些可能会(x)遇到的正则表辑ּCZQ?
Visual Basic Scripting Edition
VBScript
匚w
/^\[ \t]*$/
"^\[ \t]*$"
匚w一个空白行。?
/\d{2}-\d{5}/
"\d{2}-\d{5}"
验证一个ID L(fng)是否׃?位数字,一个连字符以及(qing)一?位数字组成。?
/<(.*)>.*<\/\1>/
"<(.*)>.*<\/\1>"
匚w一?HTML 标记。?
下表是元字符?qing)其在正则表辑ּ上下文中的行为的一个完整列表:(x)
字符
描述
\
下一个字W标Cؓ(f)一个特D字W、或一个原义字W、或一?后向引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("。?
^
匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|。?
$
匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|。?
*
匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"?* {h(hun)于{0,}。?
+
匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}。?
?
匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}。?
{n}
n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o。?
{n,}
n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'。?
{n,m}
m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ?"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?
?
当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'。?
.
匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式。?
(pattern)
匚wpattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在Visual Basic Scripting Edition 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'。?
(?:pattern)
匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式。?
(?=pattern)
正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始。?
(?!pattern)
负向预查Q在M不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?
x|y
匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"。?
[[I]xyz[/I]]
字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'。?
[^[I]xyz[/I]]
负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'。?
[[I]a-z[/I]]
字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符。?
[^[I]a-z[/I]]
负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符。?
\b
匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'。?
\B
匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'。?
\cx
匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符。?
\d
匚w一个数字字W。等价于 [0-9]。?
\D
匚w一个非数字字符。等价于 [^0-9]。?
\f
匚w一个换늬。等价于 \x0c ?\cL。?
\n
匚w一个换行符。等价于 \x0a ?\cJ。?
\r
匚w一个回车符。等价于 \x0d ?\cM。?
\s
匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]。?
\S
匚wM非空白字W。等价于 [^ \f\n\r\t\v]。?
\t
匚w一个制表符。等价于 \x09 ?\cI。?
\v
匚w一个垂直制表符。等价于 \x0b ?\cK。?
\w
匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'。?
\W
匚wM非单词字W。等价于 '[^A-Za-z0-9_]'。?
\xn
匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ(f)定的两个数字长。例如, '\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
\num
匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W。?
\n
标识一个八q制转义值或一个后向引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为后向引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?
\nm
标识一个八q制转义值或一个后向引用。如?\nm 之前臛_有is preceded by at least nm 个获取得子表辑ּQ则 nm 为后向引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的后向引用。如果前面的条g都不满Q若 n ?m 均ؓ(f)八进制数?(0-7)Q则 \nm 匹配八q制转义?nm。?
\nml
如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ(f)八进制数?(0-7)Q则匚w八进制{义?nml。?
\un
匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?
用正则表辑ּ判断输入的数字是否合?
作者:(x)unknown 更新旉Q?2005-03-17
<html>
<head>
<title>Untitled</title>
</head>
<body>
<?php
$in="2344";
if(ereg("^(-{0,1}|\+{0,1})[0-9]+(\.{0,1}[0-9]+)$",$in))
echo "Ok!";
else
echo "Sorry,Please input again!";
?>
<br>很简单的嘛!
</body>
</html>
则表辑ּ判断email和URL
作者:(x)unknown 更新旉Q?2005-03-17
<body onload="f.a.select();">
<?php
echo 'a:'.htmlspecialchars($a);
echo '<br>a1:';
$a1 = eregi_replace('(^[_.][:alnum:]-]+@([[:alnum:]][[:alnum:]-]*.)+[[:alpha:]]{2,3}$)',' <a href="mailto:\1">\1</a> ', $a) ;
echo htmlspecialchars($a1);
echo "<br>a1:$a1";
echo '<br>a2:';
$a2 = eregi_replace('([[:alnum:]]+://([[:alnum:]][[:alnum:]-]*\.)+[[:alpha:]]{2,3}([#\?/\\][^#\?/\\][:space:]][^[:space:]]*)?)',
'<a href="\1" target="_blank">\1</a>', $a);
echo htmlspecialchars($a2);
echo "<br>a2:$a2";
// eregi('^[_.][:alnum:]-]+@([[:alnum:]][[:alnum:]-]*\.)+[[:alpha:]]{2,3}$',$a) or die("not a email");
?>
<form name="f">
<input name="a" value="<?php echo $a; ?>">
<input type="submit" >
</form>
</body>
在一个字W串中查扑֏一个字W串
作者:(x)unknown 更新旉Q?2005-03-17
<html>
<head><title>正则表达?lt;/title></head>
<body>
<a href="./">q回列表</a><br>
<form action="<?echo $PHP_SELF;?>" method="post">
?lt;input type="text" name="string" value="<?echo $string;?>">中查?lt;input type="text" name="query" value="<?echo $query;?>"><br>
<input type="radio" name="where" value="" <?if(!isset($where) or $where=="") echo "checked";?>>W二个字W串可以在第一个字W串的Q何位|?lt;br>
<input type="radio" name="where" value="^" <?if(isset($where) and $where=="^") echo "checked";?>>W一个字W串以第二个字符串开?lt;br>
<input type="radio" name="where" value="$" <?if(isset($where) and $where=="$") echo "checked";?>>W一个字W串以第二个字符串结?lt;br>
<input type="checkbox" name="case" value="case" <?if(isset($case)) echo "checked";?>>区分大小?lt;br>
<input type="submit" value="查询">
</form>
<?
if(isset($string) and isset($query) and $string<>"" and $query<>""){
if(isset($case)){
$func = "ereg";
}
else{
$func = "eregi";
}
switch($where){
case "^":
$query = "^" . $query;
break;
case "$":
$query .= "$";
break;
}
eval("\$found = $func(\"$query\",\"$string\");");
if($found){
echo "扑ֈQ?;
}
else{
echo "未找刎ͼ";
}
}
?>
</body>
</html>
MM/DD/YYYY格式的日期{换ؓ(f)YYYY-MM-DD格式
作者:(x)unknown 更新旉Q?2005-03-17
<html>
<head><title>正则表达?lt;/title></head>
<body>
<a href="./">q回列表</a>
<form action="<? echo $PHP_SELF; ?>" method="post">
误入MM/DD/YYYY格式的日期:(x)
<input type="text" name="date" value="<? echo $date; ?>">
<input type="submit" value="转换为YYYY-MM-DD格式">
</form>
<?
if(isset($date)){
if ( ereg( "([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})", $date, $regs ) ) {
echo $regs[0] . "的{换结果ؓ(f)Q? . $regs[3] . "-" . $regs[1] . "-" . $regs[2];
} else {
echo "$date 的日期格式不对!<br>";
}
}
?>
</body>
</html>
对象与像素的选获得某个网上的所有超裢接
作者:(x)unknown 更新旉Q?2005-03-17
<html>
<head><title>正则表达?lt;/title></head>
<body>
<a href="./">q回列表</a><br>
<form action="<?echo $PHP_SELF;?>" method="post">
URLQ?lt;input type="text" name="url" value="<?echo $url?>"><input type="submit" value="获取所有裢?>
</form>
<?
if(isset($url)){
echo "$url 有下列裢接:(x)<br>";
$fcontents = file($url);
while(list(,$line)=each($fcontents)){
while(eregi('(href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-]+"?)(.*)',$line,$regs)){
$regs[1] = eregi_replace('(href[[:space:]]*=[[:space:]]*"?)([[:alnum:]:@/._-]+)("?)',"\\2",$regs[1]);
echo " $regs[1]<br>";
$line = $regs[2];
}
}
}
?>
</body>
</html>
正则表达?regular expression)
作者:(x)unknown 更新旉Q?2005-03-17
前言
正则表达式是烦琐的,但是强大的,学会(x)之后的应用会(x)让你除了提高效率外,?x)给你带来绝对的成就感。只要认真去阅读q些资料Q加上应用的时候进行一定的参考,掌握正则表达式不是问题?/p>
索引
1._引子
2._正则表达式的历史
3._正则表达式定?/p>
3.1_普通字W?br />3.2_非打印字W?br />3.3_Ҏ(gu)字符
3.4_限定W?br />3.5_定位W?br />3.6_选择
3.7_后向引用
4._各种操作W的q算优先U?br />5._全部W号解释
6._部分例子
7._正则表达式匹配规?/p>
7.1_基本模式匚w
7.2_字符?br />7.3_定重复出现
--------------------------------------------------------------------------------
1. 引子
目前Q正则表辑ּ已经在很多Y件中得到q泛的应用,包括*nixQLinux, Unix{)QHP{操作系l,PHPQC#QJava{开发环境,以及(qing)很多的应用Y件中Q都可以看到正则表达式的影子?/p>
正则表达式的使用Q可以通过单的办法来实现强大的功能。ؓ(f)了简单有效而又不失强大Q造成了正则表辑ּ代码的难度较大,学习(fn)h也不是很Ҏ(gu)Q所以需要付Z些努力才行,入门之后参照一定的参考,使用hq是比较单有效的?/p>
例子Q?^.+@.+\\..+$
q样的代码曾l多ơ把我自q吓退q。可能很多h也是被这L(fng)代码l吓跑的吧。l阅L文将让你也可以自由应用这L(fng)代码?/p>
注意Q这里的W?部分跟前面的内容看v来似乎有些重复,目的是把前面表格里的部分重新描述了一ơ,目的是让q些内容更容易理解?/p>
2. 正则表达式的历史
正则表达式的“祖先”可以一直上溯至对hcȝl系l如何工作的早期研究。Warren McCulloch ?Walter Pitts q两位神l生理学家研I出一U数学方式来描述q些经|络?br /> 1956 q? 一位叫 Stephen Kleene 的数学家?McCulloch ?Pitts 早期工作的基上,发表了一标题ؓ(f)“神l网事g的表C法”的论文Q引入了正则表达式的概念。正则表辑ּ是用来描述他称为“正则集的代数”的表达式,因此采用“正则表辑ּ”这个术语?/p>
随后Q发现可以将q一工作应用于?Ken Thompson 的计搜索算法的一些早期研IӞKen Thompson ?Unix 的主要发明h。正则表辑ּ的第一个实用应用程序就?Unix 中的 qed ~辑器?/p>
如他们所_(d)剩下的就是众所周知的历史了。从那时L(fng)至现在正则表辑ּ都是Z文本的编辑器和搜索工具中的一个重要部分?/p>
3. 正则表达式定?br /> 正则表达?regular expression)描述了一U字W串匚w的模式,可以用来查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?/p>
列目录时Q dir *.txt或ls *.txt中的*.txt׃是一个正则表辑ּ,因ؓ(f)q里*与正则式?的含义是不同的?
正则表达式是由普通字W(例如字符 a ?zQ以?qing)特D字W(UCؓ(f)元字W)l成的文字模式。正则表辑ּ作ؓ(f)一个模板,某个字W模式与所搜烦的字W串q行匚w?/p>
3.1 普通字W?br /> 由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以?qing)一些符受?
3.2 非打印字W?br />字符 含义
\cx 匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?
\f 匚w一个换늬。等价于 \x0c ?\cL?
\n 匚w一个换行符。等价于 \x0a ?\cJ?
\r 匚w一个回车符。等价于 \x0d ?\cM?
\s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?
\S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?
\t 匚w一个制表符。等价于 \x09 ?\cI?
\v 匚w一个垂直制表符。等价于 \x0b ?\cK?
3.3 Ҏ(gu)字符
所谓特D字W,是一些有Ҏ(gu)含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W?br />
特别字符 说明
$ 匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?
( ) 标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?
* 匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?
+ 匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?
. 匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?
[ 标记一个中括号表达式的开始。要匚w [Q请使用 \[?
? 匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??
\ 下一个字W标Cؓ(f)或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?
^ 匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?
{ 标记限定W表辑ּ的开始。要匚w {Q请使用 \{?
| 指明两项之间的一个选择。要匚w |Q请使用 \|?
构造正则表辑ּ的方法和创徏数学表达式的Ҏ(gu)一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?
3.4 限定W?br /> 限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?br />*??限定W都是贪婪的Q因为它们会(x)可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?br /> 正则表达式的限定W有Q?br /> 字符 描述
* 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?
+ 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?
? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?
{n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?
{n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?
{n,m} m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?
3.5 定位W?br /> 用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界。不能对定位W用限定符?
3.6 选择
用圆括号所有选择Ҏ(gu)hQ相?c)选择之间用|分隔。但用圆括号?x)有一个副作用Q是相关的匹配会(x)被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?br /> 其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ(f)正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ(f)负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦字符丌Ӏ?
3.7 后向引用
对一个正则表辑ּ模式或部分模式两Ҏ(gu)加圆括号导致相兛_配存储到一个(f)时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?br /> 可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存?
4. 各种操作W的q算优先U?br /> 相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?br /> 操作W?描述
\ 转义W?
(), (?:), (?=), [] 圆括号和Ҏ(gu)?
*, +, ?, {n}, {n,}, {n,m} 限定W?
^, $, \anymetacharacter 位置和顺?
| “或”操?
5. 全部W号解释
字符 描述
\ 下一个字W标Cؓ(f)一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?
^ 匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?
$ 匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?
* 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?
+ 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?
? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?
{n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?
{n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?
{n,m} m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?
? 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?
. 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?
(pattern) 匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'?
(?:pattern) 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?
(?=pattern) 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?
(?!pattern) 负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?
x|y 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?
[xyz] 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?
[^xyz] 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?
[a-z] 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?
[^a-z] 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?
\b 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?
\B 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?
\cx 匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?
\d 匚w一个数字字W。等价于 [0-9]?
\D 匚w一个非数字字符。等价于 [^0-9]?
\f 匚w一个换늬。等价于 \x0c ?\cL?
\n 匚w一个换行符。等价于 \x0a ?\cJ?
\r 匚w一个回车符。等价于 \x0d ?\cM?
\s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?
\S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?
\t 匚w一个制表符。等价于 \x09 ?\cI?
\v 匚w一个垂直制表符。等价于 \x0b ?\cK?
\w 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?
\W 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?
\xn 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ(f)定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
\num 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?
\n 标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?
\nm 标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ(f)八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?
\nml 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ(f)八进制数?(0-7)Q则匚w八进制{义?nml?
\un 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?
6. 部分例子
正则表达?说明
/\b([a-z]+) \1\b/gi 一个单词连l出现的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 一个URL解析为协议、域、端口及(qing)相对路径
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位|?
/[-a-z]/ A至z?6个字母再加一?受?
/ter\b/ 可匹配chapterQ而不能terminal
/\Bapt/ 可匹配chapterQ而不能aptitude
/Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的索匹配?
7. 正则表达式匹配规?br />7.1 基本模式匚w
一切从最基本的开始。模式,是正规表辑ּ最基本的元素,它们是一l描q字W串特征的字W。模式可以很单,由普通的字符串组成,也可以非常复杂,往往用特D的字符表示一个范围内的字W、重复出玎ͼ或表CZ下文。例如:(x)
^once
q个模式包含一个特D的字符^Q表C模式只匹配那些以once开头的字符丌Ӏ例如该模式与字W串"once upon a time"匚wQ与"There once was a man from NewYork"不匹配。正如如^W号表示开头一P$W号用来匚w那些以给定模式结字符丌Ӏ?/p>
bucket$
q个模式?Who kept all of this cash in a bucket"匚wQ与"buckets"不匹配。字W^?同时使用Ӟ表示_匚wQ字W串与模式一P。例如:(x)
^bucket$
只匹配字W串"bucket"。如果一个模式不包括^?Q那么它与Q何包含该模式的字W串匚w。例如:(x)模式
once
与字W串
There once was a man from NewYork
Who kept all of his cash in a bucket.
是匹配的?/p>
在该模式中的字母(o-n-c-e)是字面的字符Q也是_(d)他们表示该字母本w,数字也是一L(fng)。其他一些稍微复杂的字符Q如标点W号和白字符Q空根{制表符{)Q要用到转义序列。所有的转义序列都用反斜?\)打头。制表符的{义序列是Q\t。所以如果我们要一个字W串是否以制表符开_(d)可以用这个模式:(x)
^\t
cM的,用\n表示“新行”,\r表示回R。其他的Ҏ(gu)W号Q可以用在前面加上反斜杠Q如反斜杠本w用\\表示Q句?用\.表示Q以此类推?/p>
7.2 字符?/p>
在INTERNET的程序中Q正规表辑ּ通常用来验证用户的输入。当用户提交一个FORM以后Q要判断输入的电(sh)话号码、地址、EMAIL地址、信用卡L(fng){是否有效,用普通的Z字面的字W是不够的?/p>
所以要用一U更自由的描q我们要的模式的办法Q它?yu)是字符。要建立一个表C所有元韛_W的字符,把所有的元音字符攑֜一个方括号里:(x)
[AaEeIiOoUu]
q个模式与Q何元韛_W匹配,但只能表CZ个字W。用q字号可以表CZ个字W的范围Q如Q?/p>
[a-z] //匚w所有的写字母
[A-Z] //匚w所有的大写字母
[a-zA-Z] //匚w所有的字母
[0-9] //匚w所有的数字
[0-9\.\-] //匚w所有的数字Q句号和减号
[ \f\r\t\n] //匚w所有的白字W?
同样的,q些也只表示一个字W,q是一个非帔R要的。如果要匚w一个由一个小写字母和一位数字组成的字符Ԍ比如"z2"?t6"?g7"Q但不是"ab2"?r2d3" ?b52"的话Q用q个模式Q?/p>
^[a-z][0-9]$
管[a-z]代表26个字母的范围Q但在这里它只能与第一个字W是写字母的字W串匚w?/p>
前面曄提到^表示字符串的开_(d)但它q有另外一个含义。当在一l方括号里用^是,它表C“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子Q我们要求第一个字W不能是数字Q?/p>
^[^0-9][0-9]$
q个模式?&5"?g7"?-2"是匹配的Q但?12"?66"是不匚w的。下面是几个排除特定字符的例子:(x)
[^a-z] //除了写字母以外的所有字W?
[^\\\/\^] //除了(\)(/)(^)之外的所有字W?
[^\"\'] //除了双引?")和单引号(')之外的所有字W?
Ҏ(gu)字符"." (点,句号)在正规表辑ּ中用来表C除了“新行”之外的所有字W。所以模?^.5$"与Q何两个字W的、以数字5l尾和以其他非“新行”字W开头的字符串匹配。模?."可以匚wM字符Ԍ除了IZ和只包括一个“新行”的字符丌Ӏ?/p>
PHP的正规表辑ּ有一些内|的通用字符,列表如下Q?/p>
字符?含义
[[:alpha:]] M字母
[[:digit:]] M数字
[[:alnum:]] M字母和数?
[[:space:]] M白字W?
[[:upper:]] M大写字母
[[:lower:]] M写字母
[[:punct:]] M标点W号
[[:xdigit:]] M16q制的数字,相当于[0-9a-fA-F]
7.3 定重复出现
到现在ؓ(f)止,你已l知道如何去匚w一个字母或数字Q但更多的情况下Q可能要匚w一个单词或一l数字。一个单词有若干个字母组成,一l数字有若干个单数组成。跟在字W或字符后面的花括?{})用来定前面的内容的重复出现的次数?
字符?含义
^[a-zA-Z_]$ 所有的字母和下划线
^[[:alpha:]]{3}$ 所有的3个字母的单词
^a$ 字母a
^a{4}$ aaaa
^a{2,4}$ aa,aaa或aaaa
^a{1,3}$ a,aa或aaa
^a{2,}$ 包含多于两个a的字W串
^a{2,} 如:(x)aardvark和aaabQ但apple不行
a{2,} 如:(x)baad和aaaQ但Nantucket不行
\t{2} 两个制表W?
.{2} 所有的两个字符
q些例子描述了花括号的三U不同的用法。一个数字,{x}的意思是“前面的字符或字W簇只出现xơ”;一个数字加逗号Q{x,}的意思是“前面的内容出现x或更多的ơ数”;两个用逗号分隔的数字,{x,y}表示“前面的内容臛_出现xơ,但不过yơ”。我们可以把模式扩展到更多的单词或数字:(x)
^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划U的字符?
^[0-9]{1,}$ //所有的正数
^\-{0,1}[0-9]{1,}$ //所有的整数
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的数
最后一个例子不太好理解Q是吗?q么看吧Q与所有以一个可选的负号(\-{0,1})开?^)、跟着0个或更多的数?[0-9]{0,})、和一个可选的数?\.{0,1})再跟?个或多个数字([0-9]{0,})Qƈ且没有其他Q何东?$)。下面你知道能够用的更ؓ(f)单的Ҏ(gu)?/p>
Ҏ(gu)字符"?"与{0,1}是相{的Q它们都代表着Q?个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以化ؓ(f)Q?/p>
^\-?[0-9]{0,}\.?[0-9]{0,}$
Ҏ(gu)字符"*"与{0,}是相{的Q它们都代表着?个或多个前面的内容”。最后,字符"+"?{1,}是相{的Q表C?个或多个前面的内容”,所以上面的4个例子可以写成:(x)
^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划U的字符?
^[0-9]+$ //所有的正数
^\-?[0-9]+$ //所有的整数
^\-?[0-9]*\.?[0-9]*$ //所有的数
当然qƈ不能从技术上降低正规表达式的复杂性,但可以它们更容易阅诅R?