<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>好好学习天天向上</title>
<link>http://blogger.org.cn/blog/blog.asp?name=sandysong</link>
<description>大少爷的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[免费点歌]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2948</link>
<author>sandysong</author>
<pubDate>2005/2/18 23:36:27</pubDate>
<description><![CDATA[<P>点击下面这个地址可以进入点歌页面，选择歌曲，输入你的姓名和接受方的电话号码，嘿嘿，哦了</P>
<P><A href="http://btmovie.meibu.com/asp/list.asp">http://btmovie.meibu.com/asp/list.asp</A></P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[看看你和哪个明星最像]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2809</link>
<author>sandysong</author>
<pubDate>2005/2/10 2:27:32</pubDate>
<description><![CDATA[
<P>访问下面这个连接，上传你的照片，看看你和哪个明星最像。</P>
<P><A href="http://www.play-analogia.com/">www.play-analogia.com</A></P>
<P>下面是我给我老婆测试的结果：</P>
<P>源图：<IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200521163122591.JPG" border=0></P>
<P>第一像Athena Chu（朱茵）：<IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://www.play-analogia.com/stars/289.jpg" border=0></P>
<P>第二像Katie Price：<IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://www.play-analogia.com/stars/462.jpg" border=0></P>
<P>第三像Cher：<IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://www.play-analogia.com/stars/306.jpg" border=0></P>
<P>哈哈哈，有意思吧，去试试看吧</P>]]></description>
</item><item>
<title><![CDATA[PHP5 new Functions]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2683</link>
<author>sandysong</author>
<pubDate>2005/2/3 5:58:19</pubDate>
<description><![CDATA[<P>In PHP 5 there are some new functions. Here is the list of them: </P>
<P><A href="http://www.zend.com/manual/ref.array.php">Arrays</A>:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.array-combine.php"><B class=function>array_combine()</B></A> - Creates an array by using one array for keys and another for its values </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-diff-uassoc.php"><B class=function>array_diff_uassoc()</B></A> - Computes the difference of arrays with additional index check which is performed by a user supplied callback function </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-udiff.php"><B class=function>array_udiff()</B></A> - Computes the difference of arrays by using a callback function for data comparison </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-udiff-assoc.php"><B class=function>array_udiff_assoc()</B></A> - Computes the difference of arrays with additional index check. The data is compared by using a callback function </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-udiff-uassoc.php"><B class=function>array_udiff_uassoc()</B></A> - Computes the difference of arrays with additional index check. The data is compared by using a callback function. The index check is done by a callback function also </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-walk-recursive.php"><B class=function>array_walk_recursive()</B></A> - Apply a user function recursively to every member of an array </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-uintersect-assoc.php"><B class=function>array_uintersect_assoc()</B></A> - Computes the intersection of arrays with additional index check. The data is compared by using a callback function </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-uintersect-uassoc.php"><B class=function>array_uintersect_uassoc()</B></A> - Computes the intersection of arrays with additional index check. Both the data and the indexes are compared by using a callback functions </P>
<LI>
<P><A href="http://www.zend.com/manual/function.array-uintersect.php"><B class=function>array_uintersect()</B></A> - Computes the intersection of arrays. The data is compared by using a callback function </P></LI></UL>
<P><A href="http://www.zend.com/manual/ref.ibase.php">InterBase</A>:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-affected-rows.php"><B class=function>ibase_affected_rows()</B></A> - Return the number of rows that were affected by the previous query </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-backup.php"><B class=function>ibase_backup()</B></A> - Initiates a backup task in the service manager and returns immediately </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-commit-ret.php"><B class=function>ibase_commit_ret()</B></A> - Commit a transaction without closing it </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-db-info.php"><B class=function>ibase_db_info()</B></A> - Request statistics about a database </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-drop-db.php"><B class=function>ibase_drop_db()</B></A> - Drops a database </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-errcode.php"><B class=function>ibase_errcode()</B></A> - Return an error code </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-free-event-handler.php"><B class=function>ibase_free_event_handler()</B></A> - Cancels a registered event handler </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-gen-id.php"><B class=function>ibase_gen_id()</B></A> - Increments the named generator and returns its new value </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-maintain-db.php"><B class=function>ibase_maintain_db()</B></A> - Execute a maintenance command on the database server </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-name-result.php"><B class=function>ibase_name_result()</B></A> - Assigns a name to a result set </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-num-params.php"><B class=function>ibase_num_params()</B></A> - Return the number of parameters in a prepared query </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-param-info.php"><B class=function>ibase_param_info()</B></A> - Return information about a parameter in a prepared query </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-restore.php"><B class=function>ibase_restore()</B></A> - Initiates a restore task in the service manager and returns immediately </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-rollback-ret.php"><B class=function>ibase_rollback_ret()</B></A> - Rollback transaction and retain the transaction context </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-server-info.php"><B class=function>ibase_server_info()</B></A> - Request statistics about a database </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-service-attach.php"><B class=function>ibase_service_attach()</B></A> - Connect to the service manager </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-service-detach.php"><B class=function>ibase_service_detach()</B></A> - Disconnect from the service manager </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-set-event-handler.php"><B class=function>ibase_set_event_handler()</B></A> - Register a callback function to be called when events are posted </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ibase-wait-event.php"><B class=function>ibase_wait_event()</B></A> - Wait for an event to be posted by the database </P></LI></UL>
<P><A href="http://www.zend.com/manual/ref.iconv.php">iconv</A>:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-mime-decode.php"><B class=function>iconv_mime_decode()</B></A> - Decodes a MIME header field </P>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-mime-decode-headers.php"><B class=function>iconv_mime_decode_headers()</B></A> - Decodes multiple MIME header fields at once </P>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-mime-encode.php"><B class=function>iconv_mime_encode()</B></A> - Composes a MIME header field </P>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-strlen.php"><B class=function>iconv_strlen()</B></A> - Returns the character count of string </P>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-strpos.php"><B class=function>iconv_strpos()</B></A> - Finds position of first occurrence of a needle within a haystack </P>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-strrpos.php"><B class=function>iconv_strrpos()</B></A> - Finds the last occurrence of a needle within the specified range of haystack </P>
<LI>
<P><A href="http://www.zend.com/manual/function.iconv-substr.php"><B class=function>iconv_substr()</B></A> - Cut out part of a string </P></LI></UL>
<P><A href="http://www.zend.com/manual/ref.stream.php">Streams</A>:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-copy-to-stream.php"><B class=function>stream_copy_to_stream()</B></A> - Copies data from one stream to another </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-get-line.php"><B class=function>stream_get_line()</B></A> - Gets line from stream resource up to a given delimiter </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-socket-accept.php"><B class=function>stream_socket_accept()</B></A> - Accept a connection on a socket created by <A href="http://www.zend.com/manual/function.stream-socket-server.php"><B class=function>stream_socket_server()</B></A> </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-socket-client.php"><B class=function>stream_socket_client()</B></A> - Open Internet or Unix domain socket connection </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-socket-get-name.php"><B class=function>stream_socket_get_name()</B></A> - Retrieve the name of the local or remote sockets </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-socket-recvfrom.php"><B class=function>stream_socket_recvfrom()</B></A> - Receives data from a socket, connected or not </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-socket-sendto.php"><B class=function>stream_socket_sendto()</B></A> - Sends a message to a socket, whether it is connected or not </P>
<LI>
<P><A href="http://www.zend.com/manual/function.stream-socket-server.php"><B class=function>stream_socket_server()</B></A> - Create an Internet or Unix domain server socket </P></LI></UL>
<P><A href="http://www.zend.com/manual/ref.datetime.php">Date and time related</A>:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.idate.php"><B class=function>idate()</B></A> - Format a local time/date as integer </P>
<LI>
<P><A href="http://www.zend.com/manual/function.date-sunset.php"><B class=function>date_sunset()</B></A> - Time of sunset for a given day and location </P>
<LI>
<P><A href="http://www.zend.com/manual/function.date-sunrise.php"><B class=function>date_sunrise()</B></A> - Time of sunrise for a given day and location </P>
<LI>
<P><A href="http://www.zend.com/manual/function.time-nanosleep.php"><B class=function>time_nanosleep()</B></A> - Delay for a number of seconds and nano seconds </P></LI></UL>
<P><A href="http://www.zend.com/manual/ref.strings.php">Strings</A>:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.str-split.php"><B class=function>str_split()</B></A> - Convert a string to an array </P>
<LI>
<P><A href="http://www.zend.com/manual/function.strpbrk.php"><B class=function>strpbrk()</B></A> - Search a string for any of a set of characters </P>
<LI>
<P><A href="http://www.zend.com/manual/function.substr-compare.php"><B class=function>substr_compare()</B></A> - Binary safe optionally case insensitive comparison of two strings from an offset, up to length characters </P></LI></UL>
<P>Other:</P>
<P></P>
<UL>
<LI>
<P><A href="http://www.zend.com/manual/function.convert-uudecode.php"><B class=function>convert_uudecode()</B></A> - decode a uuencoded string </P>
<LI>
<P><A href="http://www.zend.com/manual/function.convert-uuencode.php"><B class=function>convert_uuencode()</B></A> - uuencode a string </P>
<LI>
<P><A href="http://www.zend.com/manual/function.curl-copy-handle.php"><B class=function>curl_copy_handle()</B></A> - Copy a cURL handle along with all of it's preferences </P>
<LI>
<P><A href="http://www.zend.com/manual/function.dba-key-split.php"><B class=function>dba_key_split()</B></A> - Splits a key in string representation into array representation </P>
<LI>
<P><A href="http://www.zend.com/manual/function.dbase-get-header-info.php"><B class=function>dbase_get_header_info()</B></A> - Get the header info of a dBase database </P>
<LI>
<P><A href="http://www.zend.com/manual/function.dbx-fetch-row.php"><B class=function>dbx_fetch_row()</B></A> - Fetches rows from a query-result that had the DBX_RESULT_UNBUFFERED flag set </P>
<LI>
<P><A href="http://www.zend.com/manual/function.fbsql-set-password.php"><B class=function>fbsql_set_password()</B></A> - Change the password for a given user </P>
<LI>
<P><A href="http://www.zend.com/manual/function.file-put-contents.php"><B class=function>file_put_contents()</B></A> - Write a string to a file </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ftp-alloc.php"><B class=function>ftp_alloc()</B></A> - Allocates space for a file to be uploaded </P>
<LI>
<P><A href="http://www.zend.com/manual/function.get-declared-interfaces.php"><B class=function>get_declared_interfaces()</B></A> - Returns an array of all declared interfaces </P>
<LI>
<P><A href="http://www.zend.com/manual/function.get-headers.php"><B class=function>get_headers()</B></A> - Fetches all the headers sent by the server in response to a HTTP request </P>
<LI>
<P><A href="http://www.zend.com/manual/function.headers-list.php"><B class=function>headers_list()</B></A> - Returns a list of response headers sent (or ready to send) </P>
<LI>
<P><A href="http://www.zend.com/manual/function.http-build-query.php"><B class=function>http_build_query()</B></A> - Generate URL-encoded query string </P>
<LI>
<P><A href="http://www.zend.com/manual/function.image-type-to-extension.php"><B class=function>image_type_to_extension()</B></A> - Get file extension for image-type returned by <A href="http://www.zend.com/manual/function.getimagesize.php"><B class=function>getimagesize()</B></A>, <A href="http://www.zend.com/manual/function.exif-read-data.php"><B class=function>exif_read_data()</B></A>, <A href="http://www.zend.com/manual/function.exif-thumbnail.php"><B class=function>exif_thumbnail()</B></A>, <A href="http://www.zend.com/manual/function.exif-imagetype.php"><B class=function>exif_imagetype()</B></A> </P>
<LI>
<P><A href="http://www.zend.com/manual/function.imagefilter.php"><B class=function>imagefilter()</B></A> - Applies Filter an image using a custom angle </P>
<LI>
<P><A href="http://www.zend.com/manual/function.imap-getacl.php"><B class=function>imap_getacl()</B></A> - Gets the ACL for a given mailbox </P>
<LI>
<P><A href="http://www.zend.com/manual/function.ldap-sasl-bind.php"><B class=function>ldap_sasl_bind()</B></A> - Bind to LDAP directory using SASL </P>
<LI>
<P><A href="http://www.zend.com/manual/function.mb-list-encodings.php"><B class=function>mb_list_encodings()</B></A> - Returns an array of all supported encodings </P>
<LI>
<P><A href="http://www.zend.com/manual/function.pcntl-getpriority.php"><B class=function>pcntl_getpriority()</B></A> - Get the priority of any process </P>
<LI>
<P><A href="http://www.zend.com/manual/function.pcntl-wait.php"><B class=function>pcntl_wait()</B></A> - Waits on or returns the status of a forked child as defined by the waitpid() system call </P>
<LI>
<P><A href="http://www.zend.com/manual/function.pg-version.php"><B class=function>pg_version()</B></A> - Returns an array with client, protocol and server version (when available) </P>
<LI>
<P><A href="http://www.zend.com/manual/function.php-check-syntax.php"><B class=function>php_check_syntax()</B></A> - Check the syntax of the specified file </P>
<LI>
<P><A href="http://www.zend.com/manual/function.php-strip-whitespace.php"><B class=function>php_strip_whitespace()</B></A> - Return source with stripped comments and whitespace </P>
<LI>
<P><A href="http://www.zend.com/manual/function.proc-nice.php"><B class=function>proc_nice()</B></A> - Change the priority of the current process </P>
<LI>
<P><A href="http://www.zend.com/manual/function.pspell-config-data-dir.php"><B class=function>pspell_config_data_dir()</B></A> - Change location of language data files </P>
<LI>
<P><A href="http://www.zend.com/manual/function.pspell-config-dict-dir.php"><B class=function>pspell_config_dict_dir()</B></A> - Change location of the main word list </P>
<LI>
<P><A href="http://www.zend.com/manual/function.setrawcookie.php"><B class=function>setrawcookie()</B></A> - Send a cookie with no url encoding of the value </P>
<LI>
<P><A href="http://www.zend.com/manual/function.snmp-read-mib.php"><B class=function>snmp_read_mib()</B></A> - Reads and parses a MIB file into the active MIB tree </P>
<LI>
<P><A href="http://www.zend.com/manual/function.sqlite-fetch-column-types.php"><B class=function>sqlite_fetch_column_types()</B></A> - Return an array of column types from a particular table </P></LI></UL>]]></description>
</item><item>
<title><![CDATA[我就不信邪！！！]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2682</link>
<author>sandysong</author>
<pubDate>2005/2/3 1:26:08</pubDate>
<description><![CDATA[<P><A>　在新浪看到的一篇文章：天秤女VS水瓶男没有天长地久。不巧我是水瓶，我女朋友是天平，唉，就是这么倒霉，写这篇文章的人肯定是个爱情失败者。如果我女朋友看到这篇文章，她肯定觉得写得对，因为如果她不选择我，她身边还会有大把大把追求者。不过我不知道自己是不是她眼中无往不胜的那棵树。总之她肯为我只身来到北京闯，我一定不能辜负她<IMG src="http://blogger.org.cn/blog/images/emot/face13.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face13.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face13.gif">。</A></P>
<P>　　以下是原文，转载自新浪。</P>
<P>　　没有天长地久，只有曾经拥有。 </P>
<P>　　当天平明白这个道理的时候，水瓶已是远在天涯。</P>
<P>　　其实只要两个人的心中不再有爱。既使是零距离接触也是天各一方，只是曾经的情投意合让天平很恍惚。这就是曾经相爱相守的那个水瓶吗？原来什么东西都是会随着时间的流逝的。没有什么东西永垂不朽。只有人生才会给你无尽的思想，苦恼和甜蜜。</P><!--画中画广告开始--><!--画中画广告结束-->
<P>　　当所有的离别都是一阵风都是理所当然的时候，你是否会感到。人间最虚伪的就是感情，就是那个曾给了你憧憬的人，你以为你有了他就不会在乎这个世界。你只要有他在你身边就有了一切幸福的延续。有了所有骄傲的理由。</P>
<P>　　你的眼里，只看到一棵树，在你的眼中无往不胜的树，你只要有这一棵树，就可以用眼角的余光轻扫那片森林。甚至于觉得森林也只是很渺小的实景。是很多余的，是你前进的障碍。你要用自己的决裂来表示你爱得有多深，有多么的专心致志。没有什么可以代替他在心目中的位置。</P>
<P>　　当日子一点点浸染着感伤和愁怨的时候。心也在一片片的分裂，飞舞在漫无边际。</P>
<P>　　那曾经美丽的片断，闪着光彩的温情都在加重这个伤口的溃败，可能你还会压抑着，埋藏着，从天堂到地狱的凋落，那道心痕到底要怎么呈现。才算得上是种凄美动人。而他，从来都是一种事不关已的势态，男人的伤不会伤到自己，只会伤到最爱他的那个女人。因为男人知道转移。对你的伤害只不过是上一任对他的记忆，他会觉得他就是这样成长的，就是这样被所爱的人所伤害的。要你明白爱情是什么，不能少了伤痛这个环节，否则这就是一种残缺的授予。是吗？</P>
<P>　　这世间百折千回的爱情故事，只是太多曾身临其境的人的稼接、转载、和传导。是不是只有当这个天空不在有眼泪在飞的时候就不会再有这般愁肠百结、伤心欲绝。只有，唯愿所有的爱情都圆满。都是一场幸福的回忆。 </P>]]></description>
</item><item>
<title><![CDATA[又和老婆视频了]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2641</link>
<author>sandysong</author>
<pubDate>2005/2/1 16:27:35</pubDate>
<description><![CDATA[<P>现在真是越来越想她了，2个多月没见了阿。昨天老婆去改了发型，还染了发，呵呵，更可爱了。</P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200521163017971.JPG" border=0><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200521163037171.JPG" border=0></P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200521163058791.JPG" border=0><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200521163122591.JPG" border=0></P>]]></description>
</item><item>
<title><![CDATA[网络真是神奇啊]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2623</link>
<author>sandysong</author>
<pubDate>2005/2/1 4:22:37</pubDate>
<description><![CDATA[
<P>　今天和几个分别10年之久的小学同学在QQ上相遇，他们的样貌真是一点都认不出来了，如果没有网络，都不知道这辈子还有没有可能联系上。</P>
<P>　脑子里对于小学时光的记忆只剩下一些零散的片断了，不过都是很经典的片断。比如偷吃卖零食老大妈的挂在架子上的无花果。翻到学校边上的煤厂，在煤堆里打架搞得一身黑。放学偷偷跑到游戏机厅打游戏结果被老妈抓到。似乎都是些不光彩的事<IMG src="http://blogger.org.cn/blog/images/emot/face17.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face17.gif">，不过回忆起来真的很有意思。</P>
<P>　经同学的指引，我又找到了我们的校友路，虽然上面的人不多，但我却有一种找到组织的感觉，哈哈。这些儿时的伙伴，现在不知道都变成什么样子了，也不知道都在做什么，不知道那时班里几个PP的女生现在是不是更PP了，所以现在十分期待聚会阿。</P>
<P>　最纯的感情，我想在年龄越小的时候越容易形成，长大了，懂得事多了，理性逐渐胜过感性，平时的社交当中也很难找到当年那种感觉了。感觉经常是逢场作戏，大一的时候参加社团，活动十分积极，经常和社团里的人一同游玩，腐败。感觉已经融入其中，自得其乐的样子，自以为找到一堆好朋友，但后来才发现，这些感情并没有进入我的心里。由于种种原因，大二的时候逐渐淡出社团，而那些曾经朋友，似乎一刹那都不见了，只剩下路上相遇时相互的点头或微笑，再无其他。也许，世界就是这个样子，社会就是这个样子，这不由得让我想起也是在那个时候流行的一首歌“水手”，那时年龄小，喜欢的只是它那脍炙人口的旋律。现在想起那首歌，那个熟悉的旋律，终于体会到了歌词里的那种感觉：</P>
<P><FONT size=4>水手</FONT></P>
<P>&nbsp;</P>
<P>苦涩的沙吹痛脸庞的感觉<BR>像父亲的责骂母亲的哭泣<BR>永远难忘记<BR>年少的我喜欢一个人在海边<BR>卷起裤管光着脚丫踩在沙滩上<BR>总是幻想海洋的尽头有另一个世界<BR>总是以为勇敢的水手是真正的男儿<BR>总是一副弱不禁风孬种的样子<BR>在受人欺负的时候总是听见水手说<BR>他说风雨中这点痛算什么<BR>擦干泪不要怕至少我们还有梦<BR>他说风雨中这点痛算什么<BR>擦干泪不要问为什么</P>
<P>长大以后为了理想而努力<BR>渐渐的忽略了父亲母亲和<BR>故乡的消息<BR>如今的我生活就像在演戏<BR>说着言不由衷的话戴着伪善的面具<BR>总是拿着微不足道的成就来骗自己<BR>总是莫名其妙感到一阵的空虚<BR>总是靠一点酒精的麻醉才能够睡去<BR>在半睡半醒之间仿佛又听见水手说<BR>他说风雨中这点痛算什么<BR>擦干泪不要怕至少我们还有梦<BR>他说风雨中这点痛算什么<BR>擦干泪不要问为什么</P>
<P>寻寻觅觅寻不到活着的证据<BR>都市的柏油路太硬踩不出足迹<BR>骄傲无知的现代人不知道珍惜<BR>那一片被文明糟踏过的海洋和天地<BR>只有远离人群才能找回我自己<BR>在带着咸味的空气中自由的呼吸<BR>耳畔又传来汽笛声和水手的笑语<BR>永远在内心的最深处听见水手说<BR>他说风雨中这点痛算什么<BR>擦干泪不要怕至少我们还有梦<BR>他说风雨中这点痛算什么<BR>擦干泪不要问为什么</P><EMBED id=MediaPlayer683 src=http://fx.hust.edu.cn/hgfx/downloading/music/dikeliuzai/ss.mp3 width=480 height=72 type=audio/mpeg autostart="true" loop="false"></EMBED> 
<P></P>]]></description>
</item><item>
<title><![CDATA[正则表达式[转载]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2622</link>
<author>sandysong</author>
<pubDate>2005/2/1 2:23:39</pubDate>
<description><![CDATA[
<P>　在php中使用正则表达式是常有的事，正则表达式的强大功能常常可以使我们事半功倍，但是，要掌握正则表达式似乎不是件容易的事，因为它对于人来讲实在是有些难读了。不过，只要认真系统的学习一下正则表达式，然后再多加练习，你会发现正则表达式是个很灵活好用的东西，而且没有想象中那么可怕。</P>
<P>　在PHP中有两种正则表达式函数库，一种是Perl兼容的，一种是POSIX兼容的，其中Perl兼容的更强大些，也更复杂些。但是，PHP文档中并没有讲述该如何使用正则表达式，只是给出了相关的库函数，因此我找来一篇文章，不算是个教程，但可以当作手册使用，对于那些学过正则表达式但是并不熟练的人来说，会很有用。</P>
<H1>正则表达式(regular expression)</H1>
<HR>

<P><FONT size=2>关键字： 正则表达式，Regular Expression</FONT></P>
<P><FONT size=2>作者：笑容</FONT></P>
<P><FONT size=2>发表于：2004年05月03日<BR>最后更新：<!--webbot bot="Timestamp" S-Type="REGENERATED" S-Format="%Y年%m月%d日 %H:%M" startspan -->2005年01月17日 19:54<!--webbot bot="Timestamp" endspan i-checksum="8120" --><BR>版权声明：使用</FONT><FONT size=2><A href="http://www.creativecommons.cn/licenses/by-nc/1.0/">创作公用版权协议</A></FONT></P>
<P><FONT size=2>引用地址：&lt;a href="http://oo8h.51.net/docs/regular_expression.htm"&gt;正则表达式(regular expression)&lt;/a&gt;</FONT></P>
<P><FONT size=2>NAV: </FONT><A href="http://oo8h.com/"><FONT size=2>笑容的八小时外</FONT></A><FONT size=2> / </FONT><A href="http://oo8h.51.net/"><FONT size=2>笑容的八小时外资料索引</FONT></A> </P>
<P><A href="http://oo8h.51.net/docs/initiate_website.htm">如何创建一个网站 (HOW TO: Initiate a website)</A> <A href="http://oo8h.51.net/docs/redhat_enterprise_linux.htm">Red Hat Enterprise Linux 介绍</A></P>
<HR>

<P><B>前言</B></P>
<P>正则表达式是烦琐的，但是强大的，学会之后的应用会让你除了提高效率外，会给你带来绝对的成就感。只要认真去阅读这些资料，加上应用的时候进行一定的参考，掌握正则表达式不是问题。</P>
<P><B>索引</B></P>
<P><FONT size=2>1._引子</FONT><FONT size=2><BR>2._正则表达式的历史<BR></FONT><FONT size=2>3._正则表达式定义</FONT></P>
<BLOCKQUOTE>
<P><FONT size=2>3.1_普通字符</FONT><FONT size=2><BR>3.2_非打印字符<BR>3.3_特殊字符<BR>3.4_限定符<BR>3.5_定位符<BR>3.6_选择<BR></FONT><FONT size=2>3.7_后向引用</FONT></P></BLOCKQUOTE>
<P><FONT size=2>4._各种操作符的运算优先级</FONT><FONT size=2><BR>5._全部符号解释<BR>6._部分例子<BR></FONT><FONT size=2>7._正则表达式匹配规则</FONT></P>
<BLOCKQUOTE>
<P><FONT size=2>7.1_基本模式匹配</FONT><FONT size=2><BR>7.2_字符簇<BR></FONT><FONT size=2>7.3_确定重复出现</FONT></P></BLOCKQUOTE>
<HR>

<H2><A name=1._引子>1. 引子</A></H2>
<P>　　目前，正则表达式已经在很多软件中得到广泛的应用，包括*nix（Linux, Unix等），HP等操作系统，PHP，C#，Java等开发环境，以及很多的应用软件中，都可以看到正则表达式的影子。</P>
<P>　　正则表达式的使用，可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大，造成了正则表达式代码的难度较大，学习起来也不是很容易，所以需要付出一些努力才行，入门之后参照一定的参考，使用起来还是比较简单有效的。</P>
<BLOCKQUOTE>
<P>例子：<SPAN style="BACKGROUND-COLOR: #00ffff"> ^.+@.+\\..+$ </SPAN></P></BLOCKQUOTE>
<P>　　这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。</P>
<P>　　注意：这里的第7部分跟前面的内容看起来似乎有些重复，目的是把前面表格里的部分重新描述了一次，目的是让这些内容更容易理解。</P>
<H2><B><A name=2._正则表达式的历史>2. 正则表达式的历史</A></B></H2>
<DIV id=nstext valign="bottom">　　正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 
<P>　　1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为“神经网事件的表示法”的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式，因此采用“正则表达式”这个术语。</P>
<P>　　随后，发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 <I>qed </I>编辑器。</P>
<P>　　如他们所说，剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。</P></DIV>
<P>　</P>
<H2><B><A name=3._正则表达式定义>3. 正则表达式定义</A></B></H2>
<P>　　正则表达式(regular expression)描述了一种字符串匹配的模式，可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。</P>
<BLOCKQUOTE>
<UL>
<LI><SPAN style="BACKGROUND-COLOR: #ffff00">列目录时，　dir *.txt或ls *.txt中的*.txt就</SPAN><FONT color=#ff0000><SPAN style="BACKGROUND-COLOR: #ffff00">不</SPAN></FONT><SPAN style="BACKGROUND-COLOR: #ffff00">是一个正则表达式,因为这里*与正则式的*的含义是不同的。</SPAN> </LI></UL></BLOCKQUOTE>
<P>　　正则表达式是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。</P>
<H3><B><A name=3.1_普通字符>3.1 普通字符</A></B></H3>
<P>　　由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 </P>
<H3><A name=3.2_非打印字符>3.2 非打印字符</A></H3>
<P>
<TABLE cellSpacing=1 cellPadding=3 border=0>
<TBODY>
<TR>
<TH style="FONT-SIZE: 12px" align=left>字符 </TH>
<TH style="FONT-SIZE: 12px" align=left>含义</TH></TR>
<TR>
<TD style="FONT-SIZE: 12px">\cx </TD>
<TD style="FONT-SIZE: 12px">匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\f </TD>
<TD style="FONT-SIZE: 12px">匹配一个换页符。等价于 \x0c 和 \cL。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\n </TD>
<TD style="FONT-SIZE: 12px">匹配一个换行符。等价于 \x0a 和 \cJ。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\r </TD>
<TD style="FONT-SIZE: 12px">匹配一个回车符。等价于 \x0d 和 \cM。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\s </TD>
<TD style="FONT-SIZE: 12px">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\S </TD>
<TD style="FONT-SIZE: 12px">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\t </TD>
<TD style="FONT-SIZE: 12px">匹配一个制表符。等价于 \x09 和 \cI。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\v </TD>
<TD style="FONT-SIZE: 12px">匹配一个垂直制表符。等价于 \x0b 和 \cK。</TD></TR></TBODY></TABLE><BR>　 </P>
<H3><A name=3.3_特殊字符>3.3 特殊字符</A></H3>
<P>　　所谓特殊字符，就是一些有特殊含义的字符，如上面说的"*.txt"中的*，简单的说就是表示任何字符串的意思。如果要查找文件名中有＊的文件，则需要对＊进行转义，即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。 </P>
<P>　</P>
<P>
<TABLE cellSpacing=1 cellPadding=3 border=0>
<TBODY>
<TR>
<TH style="FONT-SIZE: 12px" align=left>特别字符</TH>
<TH style="FONT-SIZE: 12px" align=left>说明</TH></TR>
<TR>
<TD style="FONT-SIZE: 12px">$</TD>
<TD style="FONT-SIZE: 12px">匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">( )</TD>
<TD style="FONT-SIZE: 12px">标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">*</TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">+</TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">.</TD>
<TD style="FONT-SIZE: 12px">匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">[ </TD>
<TD style="FONT-SIZE: 12px">标记一个中括号表达式的开始。要匹配 [，请使用 \[。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">?</TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\</TD>
<TD style="FONT-SIZE: 12px">将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">^</TD>
<TD style="FONT-SIZE: 12px">匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 \^。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{</TD>
<TD style="FONT-SIZE: 12px">标记限定符表达式的开始。要匹配 {，请使用 \{。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">|</TD>
<TD style="FONT-SIZE: 12px">指明两项之间的一个选择。要匹配 |，请使用 \|。</TD></TR></TBODY></TABLE></P>
<BLOCKQUOTE>
<UL>
<LI><STRONG style="FONT-WEIGHT: 400; BACKGROUND-COLOR: #ffff00">　　构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。</STRONG> </LI></UL></BLOCKQUOTE>
<P>　</P>
<H3><A name=3.4_限定符>3.4 限定符</A></H3>
<P>　　限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。<BR>*、+和?限定符都是贪婪的，因为它们会尽可能多的匹配文字，只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。<BR>　　正则表达式的限定符有：<BR>　 
<TABLE cellSpacing=1 cellPadding=3 border=0>
<TBODY>
<TR>
<TH style="FONT-SIZE: 12px" align=left>字符 </TH>
<TH style="FONT-SIZE: 12px" align=left>描述</TH></TR>
<TR>
<TD style="FONT-SIZE: 12px">* </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">+ </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">? </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{n} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{n,} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{n,m} </TD>
<TD style="FONT-SIZE: 12px">m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</TD></TR></TBODY></TABLE></P>
<H3><A name=3.5_定位符>3.5 定位符</A></H3>
<P>　　用来描述字符串或单词的边界，^和$分别指字符串的开始与结束，\b描述单词的前或后边界，\B表示非单词边界。<FONT color=#ff0000>不能对定位符使用限定符。</FONT> </P>
<H3><A name=3.6_选择>3.6 选择</A></H3>
<P>　　用圆括号将所有选择项括起来，相邻的选择项之间用|分隔。但用圆括号会有一个副作用，是相关的匹配会被缓存，此时可用?:放在第一个选项前来消除这种副作用。<BR>　　其中?:是非捕获元之一，还有两个非捕获元是?=和?!，这两个还有更多的含义，前者为正向预查，在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串，后者为负向预查，在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 </P>
<H3><A name=3.7_后向引用>3.7 后向引用</A></H3>
<P>　　对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中，所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始，连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问，其中 n 为一个标识特定缓冲区的一位或两位十进制数。<BR>　　可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。 </P>
<H2><A name=4._各种操作符的运算优先级>4. 各种操作符的运算优先级</A></H2>
<P>　　相同优先级的从左到右进行运算，不同优先级的运算先高后低。各种操作符的优先级从高到低如下：<BR>　 
<TABLE cellSpacing=1 cellPadding=3 border=0>
<TBODY>
<TR>
<TH style="FONT-SIZE: 12px" align=left>操作符 </TH>
<TH style="FONT-SIZE: 12px" align=left>描述</TH></TR>
<TR>
<TD style="FONT-SIZE: 12px">\ </TD>
<TD style="FONT-SIZE: 12px">转义符</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">(), (?:), (?=), [] </TD>
<TD style="FONT-SIZE: 12px">圆括号和方括号</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">*, +, ?, {n}, {n,}, {n,m} </TD>
<TD style="FONT-SIZE: 12px">限定符</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">^, $, \anymetacharacter </TD>
<TD style="FONT-SIZE: 12px">位置和顺序</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">| </TD>
<TD style="FONT-SIZE: 12px">“或”操作</TD></TR></TBODY></TABLE></P>
<H2><A name=5._全部符号解释>5. 全部符号解释</A></H2>
<P>
<TABLE cellSpacing=1 cellPadding=3 border=0>
<TBODY>
<TR>
<TH style="FONT-SIZE: 12px" align=left>字符 </TH>
<TH style="FONT-SIZE: 12px" align=left>描述</TH></TR>
<TR>
<TD style="FONT-SIZE: 12px">\ </TD>
<TD style="FONT-SIZE: 12px">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">^ </TD>
<TD style="FONT-SIZE: 12px">匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">$ </TD>
<TD style="FONT-SIZE: 12px">匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">* </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">+ </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">? </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{n} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{n,} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">{n,m} </TD>
<TD style="FONT-SIZE: 12px">m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">? </TD>
<TD style="FONT-SIZE: 12px">当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">. </TD>
<TD style="FONT-SIZE: 12px">匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">(pattern) </TD>
<TD style="FONT-SIZE: 12px">匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">(?:pattern) </TD>
<TD style="FONT-SIZE: 12px">匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">(?=pattern) </TD>
<TD style="FONT-SIZE: 12px">正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">(?!pattern) </TD>
<TD style="FONT-SIZE: 12px">负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">x|y </TD>
<TD style="FONT-SIZE: 12px">匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">[xyz] </TD>
<TD style="FONT-SIZE: 12px">字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">[^xyz] </TD>
<TD style="FONT-SIZE: 12px">负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">[a-z] </TD>
<TD style="FONT-SIZE: 12px">字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">[^a-z] </TD>
<TD style="FONT-SIZE: 12px">负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\b </TD>
<TD style="FONT-SIZE: 12px">匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\B </TD>
<TD style="FONT-SIZE: 12px">匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\cx </TD>
<TD style="FONT-SIZE: 12px">匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\d </TD>
<TD style="FONT-SIZE: 12px">匹配一个数字字符。等价于 [0-9]。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\D </TD>
<TD style="FONT-SIZE: 12px">匹配一个非数字字符。等价于 [^0-9]。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\f </TD>
<TD style="FONT-SIZE: 12px">匹配一个换页符。等价于 \x0c 和 \cL。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\n </TD>
<TD style="FONT-SIZE: 12px">匹配一个换行符。等价于 \x0a 和 \cJ。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\r </TD>
<TD style="FONT-SIZE: 12px">匹配一个回车符。等价于 \x0d 和 \cM。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\s </TD>
<TD style="FONT-SIZE: 12px">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\S </TD>
<TD style="FONT-SIZE: 12px">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\t </TD>
<TD style="FONT-SIZE: 12px">匹配一个制表符。等价于 \x09 和 \cI。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\v </TD>
<TD style="FONT-SIZE: 12px">匹配一个垂直制表符。等价于 \x0b 和 \cK。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\w </TD>
<TD style="FONT-SIZE: 12px">匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\W </TD>
<TD style="FONT-SIZE: 12px">匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\xn </TD>
<TD style="FONT-SIZE: 12px">匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\num </TD>
<TD style="FONT-SIZE: 12px">匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\n </TD>
<TD style="FONT-SIZE: 12px">标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\nm </TD>
<TD style="FONT-SIZE: 12px">标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\nml </TD>
<TD style="FONT-SIZE: 12px">如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">\un </TD>
<TD style="FONT-SIZE: 12px">匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</TD></TR></TBODY></TABLE></P>
<P>　</P>
<H2><A name=6._部分例子>6. 部分例子</A></H2>
<P>
<TABLE cellSpacing=1 cellPadding=3 border=0>
<TBODY>
<TR>
<TH style="FONT-SIZE: 12px" align=left>正则表达式</TH>
<TH style="FONT-SIZE: 12px" align=left>说明</TH></TR>
<TR>
<TD style="FONT-SIZE: 12px">/\b([a-z]+) \1\b/gi</TD>
<TD style="FONT-SIZE: 12px">一个单词连续出现的位置</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ </TD>
<TD style="FONT-SIZE: 12px">将一个URL解析为协议、域、端口及相对路径</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">/^(?:Chapter|Section) [1-9][0-9]{0,1}$/</TD>
<TD style="FONT-SIZE: 12px">定位章节的位置</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">/[-a-z]/</TD>
<TD style="FONT-SIZE: 12px">A至z共26个字母再加一个-号。</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">/ter\b/</TD>
<TD style="FONT-SIZE: 12px">可匹配chapter，而不能terminal</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">/\Bapt/</TD>
<TD style="FONT-SIZE: 12px">可匹配chapter，而不能aptitude</TD></TR>
<TR>
<TD style="FONT-SIZE: 12px">/Windows(?=95 |98 |NT )/</TD>
<TD style="FONT-SIZE: 12px">可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后，从Windows后面开始进行下一次的检索匹配。</TD></TR></TBODY></TABLE></P>
<P>　</P>
<H2><A name=7._正则表达式匹配规则>7. 正则表达式匹配规则</A></H2>
<P><B><A name=7.1_基本模式匹配>7.1 基本模式匹配</A></B><BR><BR>　　一切从最基本的开始。模式，是正规表达式最基本的元素，它们是一组描述字符串特征的字符。模式可以很简单，由普通的字符串组成，也可以非常复杂，往往用特殊的字符表示一个范围内的字符、重复出现，或表示上下文。例如：</P>
<BLOCKQUOTE>
<P>^once </P></BLOCKQUOTE>
<P>　　这个模式包含一个特殊的字符^，表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配，与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样，$符号用来匹配那些以给定模式结尾的字符串。</P>
<BLOCKQUOTE>
<P>bucket$ </P></BLOCKQUOTE>
<P>　　这个模式与"Who kept all of this cash in a bucket"匹配，与"buckets"不匹配。字符^和$同时使用时，表示精确匹配（字符串与模式一样）。例如：</P>
<BLOCKQUOTE>
<P>^bucket$ </P></BLOCKQUOTE>
<P>　　只匹配字符串"bucket"。如果一个模式不包括^和$，那么它与任何包含该模式的字符串匹配。例如：模式</P>
<BLOCKQUOTE>
<P>once </P></BLOCKQUOTE>
<P>与字符串</P>
<BLOCKQUOTE>
<P>There once was a man from NewYork<BR>Who kept all of his cash in a bucket.</P></BLOCKQUOTE>
<P>是匹配的。<BR><BR>　　在该模式中的字母(o-n-c-e)是字面的字符，也就是说，他们表示该字母本身，数字也是一样的。其他一些稍微复杂的字符，如标点符号和白字符（空格、制表符等），要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是：\t。所以如果我们要检测一个字符串是否以制表符开头，可以用这个模式：</P>
<BLOCKQUOTE>
<P>^\t </P></BLOCKQUOTE>
<P>类似的，用\n表示“新行”，\r表示回车。其他的特殊符号，可以用在前面加上反斜杠，如反斜杠本身用\\表示，句号.用\.表示，以此类推。<BR><BR><B><A name=7.2_字符簇>7.2 字符簇</A></B><BR><BR>在INTERNET的程序中，正规表达式通常用来验证用户的输入。当用户提交一个FORM以后，要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效，用普通的基于字面的字符是不够的。<BR><BR>所以要用一种更自由的描述我们要的模式的办法，它就是字符簇。要建立一个表示所有元音字符的字符簇，就把所有的元音字符放在一个方括号里：</P>
<BLOCKQUOTE>
<P>[AaEeIiOoUu] </P></BLOCKQUOTE>
<P>这个模式与任何元音字符匹配，但只能表示一个字符。用连字号可以表示一个字符的范围，如：</P>
<BLOCKQUOTE>
<P>[a-z] //匹配所有的小写字母 <BR>[A-Z] //匹配所有的大写字母 <BR>[a-zA-Z] //匹配所有的字母 <BR>[0-9] //匹配所有的数字 <BR>[0-9\.\-] //匹配所有的数字，句号和减号 <BR>[ \f\r\t\n] //匹配所有的白字符 </P></BLOCKQUOTE>
<P>同样的，这些也只表示一个字符，这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串，比如"z2"、"t6"或"g7"，但不是"ab2"、"r2d3" 或"b52"的话，用这个模式：</P>
<BLOCKQUOTE>
<P>^[a-z][0-9]$ </P></BLOCKQUOTE>
<P>尽管[a-z]代表26个字母的范围，但在这里它只能与第一个字符是小写字母的字符串匹配。<BR><BR>前面曾经提到^表示字符串的开头，但它还有另外一个含义。当在一组方括号里使用^是，它表示“非”或“排除”的意思，常常用来剔除某个字符。还用前面的例子，我们要求第一个字符不能是数字：</P>
<BLOCKQUOTE>
<P>^[^0-9][0-9]$ </P></BLOCKQUOTE>
<P>这个模式与"&amp;5"、"g7"及"-2"是匹配的，但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子：</P>
<BLOCKQUOTE>
<P>[^a-z] //除了小写字母以外的所有字符 <BR>[^\\\/\^] //除了(\)(/)(^)之外的所有字符 <BR>[^\"\'] //除了双引号(")和单引号(')之外的所有字符 </P></BLOCKQUOTE>
<P>特殊字符"." (点，句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串，除了空串和只包括一个“新行”的字符串。<BR><BR>PHP的正规表达式有一些内置的通用字符簇，列表如下：</P>
<BLOCKQUOTE>
<P>字符簇 含义 <BR>[[:alpha:]] 任何字母 <BR>[[:digit:]] 任何数字 <BR>[[:alnum:]] 任何字母和数字 <BR>[[:space:]] 任何白字符 <BR>[[:upper:]] 任何大写字母 <BR>[[:lower:]] 任何小写字母 <BR>[[:punct:]] 任何标点符号 <BR>[[:xdigit:]] 任何16进制的数字，相当于[0-9a-fA-F] </P></BLOCKQUOTE>
<P><B><A name=7.3_确定重复出现>7.3 确定重复出现</A></B><BR><BR>到现在为止，你已经知道如何去匹配一个字母或数字，但更多的情况下，可能要匹配一个单词或一组数字。一个单词有若干个字母组成，一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。 </P>
<BLOCKQUOTE>
<P>字符簇 含义 <BR>^[a-zA-Z_]$ 所有的字母和下划线 <BR>^[[:alpha:]]{3}$ 所有的3个字母的单词 <BR>^a$ 字母a <BR>^a{4}$ aaaa <BR>^a{2,4}$ aa,aaa或aaaa <BR>^a{1,3}$ a,aa或aaa <BR>^a{2,}$ 包含多于两个a的字符串 <BR>^a{2,} 如：aardvark和aaab，但apple不行 <BR>a{2,} 如：baad和aaa，但Nantucket不行 <BR>\t{2} 两个制表符 <BR>.{2} 所有的两个字符 </P></BLOCKQUOTE>
<P>这些例子描述了花括号的三种不同的用法。一个数字，{x}的意思是“前面的字符或字符簇只出现x次”；一个数字加逗号，{x,}的意思是“前面的内容出现x或更多的次数”；两个用逗号分隔的数字，{x,y}表示“前面的内容至少出现x次，但不超过y次”。我们可以把模式扩展到更多的单词或数字：</P>
<BLOCKQUOTE>
<P>^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 <BR>^[0-9]{1,}$ //所有的正数 <BR>^\-{0,1}[0-9]{1,}$ //所有的整数 <BR>^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数 </P></BLOCKQUOTE>
<P>最后一个例子不太好理解，是吗？这么看吧：与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,})，并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。<BR><BR>特殊字符"?"与{0,1}是相等的，它们都代表着：“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为：</P>
<BLOCKQUOTE>
<P>^\-?[0-9]{0,}\.?[0-9]{0,}$ </P></BLOCKQUOTE>
<P>特殊字符"*"与{0,}是相等的，它们都代表着“0个或多个前面的内容”。最后，字符"+"与 {1,}是相等的，表示“1个或多个前面的内容”，所以上面的4个例子可以写成：</P>
<BLOCKQUOTE>
<P>^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串 <BR>^[0-9]+$ //所有的正数 <BR>^\-?[0-9]+$ //所有的整数 <BR>^\-?[0-9]*\.?[0-9]*$ //所有的小数 </P></BLOCKQUOTE>
<P>当然这并不能从技术上降低正规表达式的复杂性，但可以使它们更容易阅读。</P>]]></description>
</item><item>
<title><![CDATA[在一个字段里存储多个值的方法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2594</link>
<author>sandysong</author>
<pubDate>2005/1/31 3:54:54</pubDate>
<description><![CDATA[
<P>　先举个比较简单的例子，比如做一个试卷系统，试卷题目分为单选题和多选题，可以用一个表来记录题干，一个表来记录选项，在记录选项的表中需要用一个字段来标明是多选还是单选。另外还得设计表格来记录答题情况，那么需不需要单选一个表，多选一个表呢？</P>
<P>　考虑一下用来保存单选答案的表，一个字段记录答案ID，一个记录答案所属题目的ID，另外一个记录答题人的选项，用整型就可以了。但是多选呢，答题人可以选择多个答案，但设置多个字段表示是不可能的，因为题目的选项可以有很多，因此，答案中选择的选项也可能会有很多，用多个字段表示非常浪费空间。那么，也可以把答案序列化。多选的答案可以是一个数组，数组里面每一项都是对应于一个所选的选项，这样就可以把多选答案保存在一个字段里。</P>
<P>　但是这么做很大的一个缺点就是，如果我想知道第一题选择Ａ和Ｂ的都有谁，这就是个非常麻烦的问题了，需要把所有答卷读取出来，把他们分别解序列化，得到数组，然后比较。这样做耗费很多资源。</P>
<P>　有一种方法，这其实是很常用的方法，就是利用位运算。对于多选的每个选项，我们按照2的k次幂来为它赋值，也就是说，对于一道题，第1个选项值为1，第2个选项值为2，第3个选项值为4，第k个选项值为2的k-1次幂。然后，对于答题人提交的答案，将所选的选项的值相加，保存到数据库中。数据库该字段设置为多少位的整型，就允许多少个选项出现在一道题中。既然单选和多选都是用整型来保存答案，那么干脆放到一个表里就可以了。查询的时候，利用位运算，要想知道有谁第一题选了第１项，那么用：</P>
<P>SELECT * FROM anwser WHERE qid=1 AND choice &amp; 1</P>
<P>如果想知道有谁选了第1项和第3项，就用：</P>
<P>SELECT * FROM answer WHERE qid=1 AND&nbsp;choice &amp; 1 AND choice &amp; 4</P>
<P>就是说，选了第k项就是&amp; 2的k-1次幂，当然，没有选第k项就是^ 2的k-1次幂，比如要想知道有谁选了第1项但没选第4项，那么：</P>
<P>SELECT * FROM answer WHERE qid=1 AND choice &amp; 1 AND choice ^ 8</P>
<P>使用这种方法既可以在一个字段保存多个值，又可以方便查询。</P>]]></description>
</item><item>
<title><![CDATA[SOHU社区的一篇文章——我奋斗了18年才和你坐在一起喝咖啡]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2593</link>
<author>sandysong</author>
<pubDate>2005/1/31 3:45:18</pubDate>
<description><![CDATA[
<P align=left>　　进Chinaren的校友路时看见的，以往看到这样的文章都会有些反感，但这回没有，作者的奋斗历程惊醒了我，我从心眼里佩服这位依靠自己的奋斗而改变自己命运的人。以下是原文：</P>
<P align=center><STRONG>我奋斗了18年才和你坐在一起喝咖啡</STRONG></P>
<P><BR>　　谨以此文送给即将毕业的学子们<BR><BR>　　我的白领朋友们，如果我是一个初中没毕业就来沪打工的民工，你会和我坐在“星巴克”一起喝咖啡吗？不会，肯定不会。比较我们的成长历程，你会发现，为了一些在你看来唾手可得的东西，我却需要付出巨大的努力。&nbsp;<BR><BR>　　从我出生的一刻起，我的身份就与你有了天壤之别，因为我只能报农村户口，而你是城市户口。如果我长大以后一直保持农村户口，那么我就无法在城市中找到一份正式工作，无法享受养老保险、医疗保险。你可能会问我：“为什么非要到城市来？农村不很好吗？空气新鲜，又不像城市这么拥挤。”可是农村没有好的医疗条件，去年SARS好像让大家一夜之间发现农村的医疗保健体系竟然如此落后，物质供应也不丰富，因为农民挣的钱少，贵一点儿的东西就买不起，所以商贩也不会进太多货。春节联欢晚会的小品中买得起等离子彩电的农民毕竟是个别现象，绝大多数农民还在为基本的生存而奋斗，于是我要进城，要通过自己的奋斗获得你生下来就拥有的大城市户口。<BR><BR>　　考上大学是我跳出农门的惟一机会。我要刻苦学习，小学升初中，初中升高中，高中考大学，我在独木桥上奋勇搏杀，眼看着周围的同学一批批落马，前面的道路越来越窄，我这个佼佼者心里不知是喜是忧。激烈的竞争让我不敢疏忽，除了学习功课，我无暇顾及业余爱好，学校也没有这些发展个人特长的课程。进入高中的第一天，校长就告诉我们这三年只有一个目标——高考。于是我披星戴月，早上5∶30起床，晚上11∶00睡觉，就连中秋节的晚上，我还在路灯下背政治题。<BR><BR>　　而你的升学压力要小得多，竞争不是那么激烈，功课也不是很沉重，你可以有充足的时间去发展个人爱好，去读课外读物，去球场挥汗如雨，去野外享受蓝天白云。如果你不想那么辛苦去参加高考，只要成绩不是太差，你可以在高三时有机会获得保送名额，哪怕成绩忒差，也会被“扫”进一所本地三流大学，而那所三流大学我可能也要考到很高的分数才能进去，因为按地区分配的名额中留给上海本地的名额太多了。<BR><BR>　　我们的考卷一样我们的分数线却不一样，但是当我们都获得录取通知书的时候，所交的学费是一样的。每人每年6000元，四年下来光学费就要2.4万元，再加上住宿费每人每年1500元，还有书本教材费每年1000元、生活费每年4000元（只吃学校食堂），四年总共5万元。2003年上海某大学以“新建的松江校区环境优良”为由，将学费提高到每人每年1万元，这就意味着仅学费一项四年就要4万元，再加上其他费用，总共6.6万元。6.6万元对于一个上海城市家庭来说也许算不上沉重的负担，可是对于一个农村的家庭，这简直是一辈子的积蓄。我的家乡在东部沿海开放省份，是一个农业大省，相比西部内陆省份应该说经济水平还算比较好，但一年辛苦劳作也剩不了几个钱。以供养两个孩子的四口之家为例，除去各种日常必需开支，一个家庭每年最多积蓄3000元，那么6.6万元上大学的费用意味着22年的积蓄！前提是任何一个家庭成员都不能生大病，而且另一个孩子无论学习成绩多么优秀，都必须剥夺他上大学的权利，因为家里只能提供这么多钱。我属于比较幸运的，东拼西凑加上助学贷款终于交齐了第一年的学费，看着那些握着录取通知书愁苦不堪全家几近绝望的同学，我的心中真的不是滋味。教育产业化时代的大学招收的不仅是成绩优秀的同学，而且还要有富裕的家长。<BR><BR>　　我终于可以如愿以偿地在大学校园里汲取知识的养分！努力学习获得奖学金，假期打工挣点生活费，我实在不忍心多拿父母一分钱，那每一分钱都是一滴汗珠掉在地上摔成八瓣挣来的血汗钱啊！<BR><BR>　　来到上海这个大都市，我发现与我的同学相比我真是土得掉渣。我不会作画，不会演奏乐器，不认识港台明星，没看过武侠小说，不认得MP3，不知道什么是walkman，为了弄明白营销管理课上讲的“仓储式超市”的概念，我在“麦德隆”好奇地看了一天，我从来没见过如此丰富的商品。<BR><BR>　　我没摸过计算机，为此我花了半年时间泡在学校机房里学习你在中学里就学会的基础知识和操作技能。我的英语是聋子英语、哑巴英语，我的发音中国人和外国人都听不懂，这也不能怪我，我们家乡没有外教，老师自己都读不准，怎么可能教会学生如何正确发音？基础没打好，我只能再花一年时间矫正我的发音。我真的很羡慕大城市的同学多才多艺，知识面那么广，而我只会读书，我的学生时代只有学习、考试、升学，因为只有考上大学，我才能来到你们中间，才能与你们一起学习，所有的一切都必须服从这个目标。<BR><BR>　　我可以忍受城市同学的嘲笑，可以几个星期不吃一份荤菜，可以周六周日全天泡在图书馆和自习室，可以在周末自习回来的路上羡慕地看着校园舞厅里的成双成对，可以在寂寞无聊的深夜在操场上一圈圈地奔跑。我想有一天我毕业的时候，我能在这个大都市挣一份工资的时候，我会和你这个生长在都市里的同龄人一样——做一个上海公民，而我的父母也会为我骄傲，因为他们的孩子在大上海工作！<BR><BR>　　终于毕业了，在上海工作难找，回到家乡更没有什么就业机会。能幸运地在上海找到工作的应届本科生只有每月2000元左右的工资水平，也许你认为这点钱应该够你零花的了，可是对我来说，我还要租房，还要交水电煤电话费还要还助学贷款，还想给家里寄点钱让弟妹继续读书，剩下的钱只够我每顿吃盖浇饭，我还是不能与你坐在“星巴克”一起喝咖啡！<BR><BR>　　如今的我在上海读完了硕士，现在有一份年薪七八万的工作。我奋斗了18年，现在终于可以与你坐在一起喝咖啡。我已经融入到这个国际化大都市中了，与周围的白领朋友没有什么差别。可是我无法忘记奋斗历程中那些艰苦的岁月，无法忘记那些曾经的同学和他们永远无法实现的夙愿。于是我以第一人称的方式写下了上面的文字，这些是最典型的中小城市和农村平民子弟奋斗历程的写照。每每看到正在同命运抗争的学子，我的心里总是会有一种沉重的责任感。<BR><BR>　　写这篇文章不是为了怨天尤人，这个世界上公平是相对的，这并不可怕，但是对不公平视而不见是非常可怕的。我在上海读硕士的时候，曾经讨论过一个维达纸业的营销案例，我的一位当时曾有三年工作经验，现任一家中外合资公司人事行政经理的同学，提出一个方案：应该让维达纸业开发高档面巾纸产品推向9亿农民市场。我惊讶于她提出这个方案的勇气，当时我问她是否知道农民兄弟吃过饭后如何处理面部油腻，她疑惑地看着我，我用手背在两侧嘴角抹了两下，对如此不雅的动作她投以鄙夷神色。<BR><BR>　　在一次宏观经济学课上，我的另一同学大肆批判下岗工人和辍学务工务农的少年：“80%是由于他们自己不努力，年轻的时候不学会一门专长，所以现在下岗活该！那些学生可以一边读书一边打工嘛，据说有很多学生一个暑假就能赚几千元，学费还用愁吗？”我的这位同学太不了解贫困地区农村了。<BR><BR>　　我是70年代中期出生的人，我的同龄人正在逐渐成为社会的中流砥柱，我们的行为将影响社会和经济的发展。把这篇文章送给那些在优越环境中成长起来的年轻人和很久以前曾经吃过苦现在已经淡忘的人，关注社会下层，为了这个世界更公平些，我们应该做些力所能及的事情，让社会责任感驻留我们的头脑。<BR><BR>　　我花了18年时间才能和你坐在一起喝咖啡。<BR><BR>　　把这篇文章送给那些在优越环境中成长起来的年轻人和很久以前曾经吃过苦现在已经淡忘的人。为了这个世界更公平些，我们应该做些力所能及的事情，特别是在作关乎众人命运的决策的时候，让这份社会责任感驻留我们的头脑。<BR></P>]]></description>
</item><item>
<title><![CDATA[昨天和老婆视频了]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2592</link>
<author>sandysong</author>
<pubDate>2005/1/31 3:35:06</pubDate>
<description><![CDATA[
<P>越看越漂亮，我爱你老婆，过完节早点回来啊！</P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/20051313340491.JPG" border=0><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200513133417764.JPG" border=0></P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200513133426524.JPG" border=0><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200513133433517.JPG" border=0></P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200513133446809.JPG" border=0><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/20051313390600.JPG" border=0></P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200513133919317.JPG" border=0><IMG src="http://blogger.org.cn/blog/images/emot/face11.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face11.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face11.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face41.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face41.gif"><IMG src="http://blogger.org.cn/blog/images/emot/face41.gif"></P>]]></description>
</item><item>
<title><![CDATA[XML学习笔记（一）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=sandysong&amp;id=2591</link>
<author>sandysong</author>
<pubDate>2005/1/31 2:52:50</pubDate>
<description><![CDATA[<A></A> 
<P align=center><A><STRONG>　XML Fundamentals</STRONG></A><STRONG>：</STRONG></P>
<OL>
<LI>
<DIV align=left><FONT face=宋体>Tag Syntax: Start-tags begin with <TT class=literal>&lt;</TT> and end-tags begin with <TT class=literal>&lt;/.</TT></FONT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><FONT face=宋体>Empty elements: begins with <TT class=literal>&lt;</TT> but ends with <TT class=literal>/&gt;</TT>.</FONT> </TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>XML is case sensitivity.</TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>Root element: It is the first element in the document and the element that contains all other elements.</TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>Mixed Content: contain both <A name=IXTR3-0>character data and child elements.</A></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>Attributes: a <A name=IXT-2-238800>name-value pair attached to the element's <A name=IXT-2-238801>start-tag.</A>Names are separated from values by an equals sign and optional whitespace. Values are enclosed in single or double quotation marks.</TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>XML Names: may contain essentially any alphanumeric character.may also include non-English letters, numbers, and ideograms such as <EM class=emphasis>&ouml;</EM>, <EM class=emphasis>&ccedil;</EM>, and 串.They may also include these three punctuation characters: the underscore"-", the hyphen"_", the period".".</TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>Entity References: &amp;lt; <TT class=literal>&amp;amp;</TT> &amp;gt; <TT class=literal>&amp;quot;</TT> &amp;apos; and some other user defined entity references.</TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>CDATA Sections: is set off by a <TT class=literal>&lt;![CDATA[</TT> and <TT class=literal>]]&gt;</TT>. Everything between the <TT class=literal>&lt;![CDATA[</TT> and the <TT class=literal>]]&gt;</TT> is treated as raw character data.</TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal>Comments: begin with <TT class=literal>&lt;!--</TT> and end with the first occurrence of <TT class=literal>--&gt;, a three hyphen close like <TT class=literal>---&gt;</TT> is specifically forbidden.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>Processing Instructions: begins with <TT class=literal>&lt;?</TT><A name=IXT-2-238828> and ends with <TT class=literal>?&gt;</TT>. Immediately following the <TT class=literal>&lt;?</TT> is an XML name called the <EM class=emphasis>target</EM></A>.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>The XML Declaration: The XML declaration looks like a processing instruction with the name <TT class=literal>xml</TT> and <TT class=literal>version</TT>, <TT class=literal>standalone</TT>, and <TT class=literal>encoding</TT> attributes. example: <STRONG>&lt;?xml version="1.0" encoding="ASCII" standalone="yes"?&gt;</STRONG></TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>Checking Documents for Well-Formedness: Every start-tag must have a matching end-tag.</TT></TT></DIV></LI></OL>
<UL>
<LI>
<DIV align=left><TT class=literal><TT class=literal>Elements may nest, but may not overlap.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>There must be exactly one root element.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>Attribute values must be quoted.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>An element may not have two attributes with the same name.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>Comments and processing instructions may not appear inside tags.</TT></TT></DIV></LI>
<LI>
<DIV align=left><TT class=literal><TT class=literal>No unescaped &lt; or &amp; signs may occur in the character data of an element or attribute. </TT></TT></DIV></LI></UL>
<P align=left><TT class=literal><TT class=literal></TT></TT><TT class=literal>&nbsp;</P></TT>]]></description>
</item>
</channel>
</rss>